プロが教えるわが家の防犯対策術!

Linux系OSのシェルスクリプトについて質問です。
スクリプトの内容としては各主要サービスの起動と停止を行う内容になります。
ここでお伺いしたい内容はスクリプトの途中でサービスが起動しているかどうか、grepの戻り値によって処理を変更する場合にgrepの戻り値がどうにもおかしい場合、どのような原因が考えられるか、ということです。

【スクリプト内容(抜粋)】
#!/bin/bash
---中略---
echo "Apache2起動前確認" | tee -a ${LOG}
ps -ef | grep apache2 | grep -v "grep" > /dev/null
if [ $? == 0 ];
then
---省略---

上記の内容はapache2を起動する際、apache2が起動していれば処理を中止する内容の一部ですが、当然起動していればpsコマンドで内容が出るのでgrepの戻り値は0になり、「then」の内容が実施されます。
これはこれで完成されているので問題なく稼動します。
しかしこれとまったく同じ内容で、apache2をmysqlに変更したものが問題でこちらが正常に動作しないのです。

【スクリプト内容(抜粋)】
#!/bin/bash
---中略---
echo "MySQL起動前確認" | tee -a ${LOG}
ps -ef | grep mysql | grep -v "grep" > /dev/null
if [ $? == 0 ];
then
---省略---

これだとなぜか停止しているときに戻り値が「0」、起動しているときに戻り値が「1」になってしまいます。
ifとpsの間に「echo $?」をかませてみても想定外の戻り値がセットされているためif文そのものには間違いはありません。
また、コマンドラインで「ps -ef | grep mysql | grep -v "grep" > /dev/null ; echo $?」を
実施しても戻り値は「1」に(停止している場合)なるのですが、スクリプト上では戻り値「0」がセットされるようです。

何ゆえこのような意図しない動作をするのか考えてもわかりません。
apache2の場合だと正常に動くだけになおわかりません。
因みに停止しているとき、起動しているときでまったく逆の戻り値がそれぞれ返ってきているようです。
どなたか原因がわかる人は教えてください、宜しくお願いいたします。

A 回答 (2件)

ん~, if の条件にわざわざ test を使っているのはなぜなんでしょうか.


素直にパイプラインを if の条件に書けばいいだけのように見えるんですが.
    • good
    • 0

grep の出力を/dev/nullに捨てずに画面に表示させてみて、停止時に何が一致しているのかを見れば手がかりになるでしょう。

    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!