以下に従わないので、誤って設計されたinitスクリプトがあります。Linux標準の基本仕様
次のコマンドは、実行中の場合は終了コード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
答え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.)