私のinitスクリプトは、Linux 標準ベース仕様
以下は実行中の場合は終了コード0、実行されていない場合は終了コード3になります。
service foo status; echo $?
ただし、スクリプトの設計方法により、常に 0 が返されます。大幅に書き直さずにスクリプトを修正することはできません (service foo restart は service foo status に依存しているため)。
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
答え1
grep
出力を にパイプするwc
と、ではなくecho $?
の終了コードが返されます。wc
grep
-q
この問題を回避するには、次のオプションを使用しますgrep
。
/etc/init.d/foo status | /bin/grep -q "up and running"; echo $?
目的の文字列が見つからない場合は、grep
ゼロ以外の終了コードを返します。
編集: 提案されたようにスプラティックさん、 あなたは言えた:
/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.)