Linux Standard Base Specification に準拠していないため、設計が不十分なinitスクリプトがあります。
以下は、実行中の場合は0、実行されていない場合は3の終了コードを持つ必要があります。
service foo status; echo $?
ただし、スクリプトの設計方法により、常に0が返されます。大幅な書き換えがないとスクリプトを修正できません(サービスfooの再起動はサービスfooのステータスに依存するため)。
service foo status
が実行中の場合は0を返し、実行されていない場合は3を返すように、この問題をどのように回避できますか?
私がこれまでに持っているもの:
root@foo:/vagrant# service foo start
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l
1
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l;echo $?
0 # <looks good so far
root@foo:/vagrant# service foo stop
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l
0
root@foo:/vagrant# /etc/init.d/foo status | /bin/grep "up and running"|wc -l;echo $?
0 # <I need this to be a 3, not a 0
grep
出力をwc
にパイプしていると、echo $?
はwc
ではなくgrep
の終了コードを返します。
grep
に-q
オプションを使用すると、問題を簡単に回避できます。
/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?
目的の文字列が見つからない場合、grep
はゼロ以外の終了コードを返します。
編集: mr.spuratic によって示唆されているように、あなたは言うことができます:
/etc/init.d/foo status | /bin/grep -q "up and running" || (exit 3); echo $?
文字列が見つからない場合に3
の終了コードで戻るため。
man grep
は次のように伝えます:
-q, --quiet, --silent
Quiet; do not write anything to standard output. Exit
immediately with zero status if any match is found, even if an
error was detected. Also see the -s or --no-messages option.
(-q is specified by POSIX.)