web-dev-qa-db-ja.com

終了コードを使用したcronジョブの監視

シェルスクリプトを使用してcronジョブを監視したい。しかし、最後のコマンドの終了コードを含む変数を使用すると、常に「0」になります。 cronジョブの後にこのスクリプトを実行し、「終了コード」の値が「0」(スクリプトの開始)になるためだと思います。スクリプトの開始を無視して、前のcronジョブの「終了コード」変数を使用するにはどうすればよいですか。

$ ls foo; echo $?
 ls:fooにアクセスできません:そのようなファイルまたはディレクトリはありません
 2 
$ ls foo 
 ls:fooにアクセスできません:そのようなファイルまたはディレクトリはありません
 $ sh test.sh 
 0 

私のtest.sh:

#!/ bin/bash 
 
 notify(){
 EXIT_CODE = $?
 echo $ {EXIT_CODE} 
} 
通知する
1
Pasily_V

コマンドの終了ステータスは、システムにグローバルに保存されるものではありません。コマンドを実行したシェルによってローカルに保持されます。シェルが別のコマンドを実行するとすぐに、以前の終了ステータスは失われます。

シェルは、最後のコマンドのステータスで終了します。したがって、シェルスクリプトの最後のコマンドが失敗した場合、シェルの終了ステータスもゼロ以外になります。

Cronジョブの結果である終了ステータスが他のランダムなシェルセッションまたはスクリプトで決定される可能性があるとあなたがどのように考えていたかはわかりません。 20個のジョブが並行して実行されている場合、どの終了ステータスがどのジョブに属しているかを確認できますか?できません。

終了ステータスをステータスファイルに保存するには、cronジョブを修正する必要があります。その後、そのステータスファイルを読み取ることができます。

1
wurtel

終了コードをパラメーターとしてスクリプトに渡すことができます。

ls -l /tmp/filethatdoesnotex.ist
/usr/local/bin/test.sh $?

test.shで:

RESULT=$1
if [ $RESULT -gt 0 ]
then
   echo "something bad happened and ended with result $RESULT" >&2
else
   echo "everything is fine, sleep on"
fi
0
Gerard H. Pille