私のinit.dスクリプトがset -eを実行したように見えるのはなぜですか?

私のinit.dスクリプトがset -eを実行したように見えるのはなぜですか?

以前の同僚によって作成されたinit.dスクリプトを見ていますが、今は正しく実行されません。 centos-6で実行されます。

いくつかの実験の終わりに問題の原因を見つけました。彼が書いたスクリプトは、エラーを報告する前にkill -TERMコマンドがcitonを実行するまで最大30秒待ちます。この目的のために、彼は次のコマンドを実行します。

kill -0 $pid

終了したプログラムが終了したかどうかをテストします。

Kill -0 コマンドによりエラーが発生します。

/etc/init.d/celerybeat line 211: kill (<pid>) - No such process

回線が失敗した直後に存在します。

これは私がset -eから期待しているものですが、スクリプトはset -eを実行しません。実際には、kill -0コマンドが設定されていると失敗するというメモでその行をコメントアウトしたので、彼はこのコマンドを設定したくないことをよく知っています。

代わりに、サービスを介して実行するか、/etc/init.dディレクトリから直接スクリプトを実行すると、これが発生します。

それでは、..set -eが設定されているかのようにスクリプトが実行されるのはなぜですか?さらに重要なのは、このように実行されるのを防ぐため、または例外を発生させることなくpidが実行されていることを確認するために行を書き直すことです。

答え1

set +eエラー終了を有効または無効にするか、set +o errexitエラー終了が適用されないように条件でコマンドを実行できます。最も簡単なのは次のとおりです。

somecmd ... || true

kill -0ただし、これは戻り値を破壊し、設定以外に多くの操作を行わないため、必要になる場合があります。おそらく次のようになります。

if kill -0 "$pid" 2>/dev/null ; then
    echo it lives
fi

「理由」については、CentOS 6がUpstartを実行していると思います。一部のUbuntuドキュメントset -eUpstartがアクティブなスクリプトを実行していることを示すようです。

関連情報