2016-07-29 6 views
2

これはなぜ動作しないのですか?whileループがbashでpgrepを使用してサービスが存在するかどうかを確認する

/usr/bin/mysqld_safe 
    STATUS=$(/usr/bin/pgrep mysql | wc -l) 
    while $STATUS -eq 0; do 
    echo "$STATUS" 
    sleep 1 
    done 

これは論理に反します。はい、私はbashに精通していません:)

p.s.私はサービスが始まるまで待つつもりですが、これを実行した後でも "$ STATUS"というエコーは表示されません!そのループはこれがmysqld_safeを実行

答えて

2

を実行していない:

/usr/bin/mysqld_safe 

これはpgrepを実行し、STATUSに結果を格納します。

STATUS=$(/usr/bin/pgrep mysql | wc -l) 

STATUSが再び更新されることはありません。これは、STATUSの固定固定値を使用してループします。

while $STATUS -eq 0; do 
    echo "$STATUS" 
    sleep 1 
    done 

whileループでのテストが不正です。読み込みする必要があります。

while [ "$STATUS" -eq 0 ]; do 

をライブアップデートを取得するには、pgrepは、ループ内で実行する必要があります。さらに、pgrepは、終了コード、テストコマンド、[...]を設定する不必要である理由:

のMySQLのインスタンスが存在しないながら実行ループを維持するには、次の戻りpgrep

while ! /usr/bin/pgrep mysql >/dev/null; do 

成功(終了コード= 0 )に一致するプロセスが見つかったとき。一致するプロセスがないときにループを繰り返すようにしているようだから、!を使用して終了コードを反転します。

それとも、戻って一緒にそれをすべて置く:

/usr/bin/mysqld_safe 
while ! /usr/bin/pgrep mysql >/dev/null; do 
    echo "No such process" 
    sleep 1 
done 

whileループが実行されることはありません、mysqld_safeが正常に起動すると仮定すると。 whileループからの出力は、mysqld_safeが開始されないことがわかります。

あなたが代わりに連続ステータス更新する場合:

/usr/bin/mysqld_safe 
while true; do 
    /usr/bin/pgrep mysql >/dev/null 
    echo "Current status: $?" 
    sleep 1 
done 
+0

まだ動作しません –

+0

@サリバンご確認ください:コードのどの部分を試しましたか?何をしたいのですか?そして、実際に試したときに何が起こったのですか? – John1024

+0

私はそのようなプロセス通知を受け取りません。 –

2

をおそらく解決策は、1つの現在の状態を反映するために、ループ内STATUS変数を更新する必要がある。この

STATUS=0 
while [ $STATUS -eq 0 ]; do 
    echo $STATUS 
    sleep 1 
    STATUS=$(/usr/bin/pgrep mysql | wc -l) 
done 

のようなものかもしれません。

+0

くそー!私はbashについてもっと知りたい、私はコマンドのエイリアスを作っていると思った。もう一つ疑問があります。私は-eq -neなどについてどこを読んでいますか? –

+1

概観は、例えば、 http://tldp.org/LDP/abs/html/comparison-ops.html – ewcz

関連する問題