web-dev-qa-db-ja.com

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

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
4
spuder

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