初期化スクリプトをだまして 0 を返す方法

初期化スクリプトをだまして 0 を返す方法

私の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 $?の終了コードが返されます。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.)

関連情報