initスクリプトをだまして0を返す方法

initスクリプトをだまして0を返す方法

以下に従わないので、誤って設計された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 $?wcgrep

-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.)

関連情報