2012-03-01 10 views
0

MySQLレプリケーションステータスを監視する簡単なBashスクリプトを作成しようとしています。スクリプトは次のようなものです:BASH:条件をテストする前にエラーを確認してください

#!/bin/bash 
dbhost=192.168.1.2 
repluser=root 
replpasswd=password 
echo "show slave status\G"|\ 
mysql -h $dbhost -u $repluser -p$replpasswd > tmpd 2>/dev/null 
repl_IO=$(cat tmpd | grep "Slave_IO_Running" | cut -f2 -d':') 
repl_SQL=$(cat tmpd | grep "Slave_SQL_Running" | cut -f2 -d':') 
if [ $repl_IO != "Yes" -o $repl_SQL != "Yes" ] ; then 
    echo 
    echo -e "\033[31m Replication Error." 
    echo -e "\033[0m" 
    mail -s "replication error" [email protected] < tmpd 

else 
    echo 
    echo -e "\033[32mReplication is working fine" 
    echo -e "\033[0m" 

fi 

問題は、スクリプトがマスターとスレーブの両方が起動している場合にのみ機能することです。マスターがダウンしていて、スクリプトを実行すると、エラーメッセージが表示され、電子メールが送信されます。 マスター/スレーブの両方が起動している場合、スクリプトは「レプリケーションは正常に動作しています」と表示します。私はシャットダウンスレーブとは、スクリプトを実行するときしかし、私はこのエラーを取得する:

./monitor.bash: line 9: [: too many arguments 

Replication is working fine 

私はこの問題は、私がスレーブMySQLサーバを照会していますから、それはそれを見つけていないことを知っています。したがって、条件Slave_IO_RunningとSlave_SQL_Runningをチェックしていません。これらの条件を実行する前に、スレーブサーバーが起動しているかどうかの確認については、どうすれば に行くのでしょうか。つまり、マスター&スレーブが稼動していて、 が稼働していて、それがそれらの条件と一致していれば、「レプリケーションは正常に動作しています」と表示するだけです。どんな助けもありがとう。ありがとうございました。あなたのスクリプトで

答えて

4

内部で使用されているすべての変数の周りに「マークをつけので、この:

if [ $repl_IO != "Yes" -o $repl_SQL != "Yes" ] ; then 

がこれに相当します

if [ != Yes -o != Yes ] ; then 

それがうまくいかない理由がわかると思います。あなたは、彼らは関係なく、彼らが含まれているものを、単一の引数として扱わないしているように、二重引用符であなたのパラメータ拡張をラップするいずれかの必要があります。

if [ "$repl_IO" != "Yes" -o "$repl_SQL" != "Yes" ] ; then 

またはそれは少し賢く付きなので、[[...]]代わりの[...]を使用しますこれらの事:

if [[ $repl_IO != "Yes" -o $repl_SQL != "Yes" ]] ; then 

または両方:

if [[ "$repl_IO" != "Yes" -o "$repl_SQL" != "Yes" ]] ; then 
+0

こんにちは、あなたの助けと説明いただき、誠にありがとうございます。非常に高く評価。 – user1013264

+0

@ user1013264:ようこそ! – ruakh

1

一つの問題:経験豊富なシェルプログラマがあれば、変数がステートメント

空の場合は、[場合は[$ fooの=何か]

は=

のようにシェルになりますことを知っています何か]

あなたは

でこの問題を解決することができれば[ "$ fooの" =何か]

$repl_IO$repl_SQLが空白の場合、一般的には、[]

0

それともbashを使用している場合[[ ]]を使用するには、変数を引用することは必要とされていませんそれは[ ]より強力です。 freenodeののIRCチャンネルに

greybotは言った:

[[ is a bash keyword similar to (but more powerful than) the [ command. See http://mywiki.wooledge.org/BashFAQ/031 and http://mywiki.wooledge.org/BashGuide/TestsAndConditionals . Unless you're writing for POSIX sh, we recommend [[.

+0

IMOあなたは記事をリンクするだけで、ボットのファクトイドは含めないでください。 – jordanm

関連する問題