6

以下は、bashで実行しているスクリプトです。そしてそれはうまくいきます。

fileexist=0
for i in $( ls /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done); do
  mv /data/read-only/clv/daily/Finished-HADOOP_EXPORT_&processDate#.done /data/read-only/clv/daily/archieve-wip/
  fileexist=1
done

問題文:-

を使用して毎日実行する必要がある上記のシェルスクリプトには、がcron jobありませんerror/exception handling mechanism。何かがうまくいかない場合、何が起こったのかわかりませんか?

上記のスクリプトを実行した後、あるsome other scripts that will be dependent on the data provided by above scriptので、スクリプトデータに依存している他の人から、何か問題が発生したという苦情が常に寄せられます。

get notified if anything wrong has happenedでは、スクリプトでできる方法はありますか?とその時点でスクリプトを実行しているとしたら、cluster is having some maintenance間違いなく失敗するので、上記のスクリプトが失敗した場合は通知を受けて、何か問題が発生したことを確認できます。

私の質問が十分に明確であることを願っています。

どんな考えでもありがたいです。

4

3 に答える 3

11

freetxが回答したように、各コマンドの終了ステータスを確認できますが、これは例外処理ではなく手動のエラー確認です。で例外処理に相当するものを取得する標準的な方法shは、スクリプトをで開始することset -eです。これはsh、実行されたコマンドが失敗するとすぐにゼロ以外のステータスで終了するように指示します(つまり、ゼロ以外の終了ステータスで終了します)。

そのようなスクリプトの一部のコマンドが(おそらく)失敗することが意図されている場合は、構成を使用できますCOMMAND || true。これにより、その式の終了ステータスがゼロになります。例えば:

#!/bin/sh

# if any of the following fails, the script fails
set -e
mkdir -p destdir/1/2
mv foo destdir/1/2
touch /done || true    # allowed to fail

cronによって呼び出されたスクリプトで問題が発生したときに通知を受け取るようにする別の方法は、エラーが発生しない限り何も出力しないというUnixの規則に従うことです。成功した実行は通知なしに通過し、失敗した実行はcronデーモンに電子メールでエラーを通知させます。これを機能させるには、システムでローカルメール配信を正しく構成する必要があることに注意してください。

于 2012-09-09T06:30:28.987 に答える
6

すべてのUNIXコマンドラインユーティリティでは、成功すると0を返し、失敗するとゼロ以外を返すのが通例です。したがって、$を使用できますか?最後の戻り値を表示し、それに応じて処理するパターン。

例えば:

> ls
> file1 file2
> echo $?
> 0
> ls file.no.exist
> echo $?
> 1

したがって、これを基本的なエラー検出として使用して、問題が発生していないかどうかを確認できます。したがって、通常のアプローチは

some_command
if [ $? -gt 0 ]
then
handle_error here
fi
于 2012-09-09T00:27:39.643 に答える
0

他のスクリプトが同じマシン上にある場合、しばらくスリープしていることがわかった場合は、このスクリプトの他のスクリプトでpgrepを実行し、後で他のスクリプトを試して、プロセスがなくなったことを再確認できます。

スクリプトが別のマシン上にある場合、またはローカルの場合、他の方法は、実行中のhttpブラウザーを介してアクセス可能なリモートマシン上に一時ファイルを生成し、他のスクリプトがステータス、つまり実行中または完了を確認できるようにすることです。

また、これらのエラーを探す別のスクリプトをラップし、見つかった場合はメールで通知し、そうでない場合は通常どおり結果を送信することもできます。

go=0;
function check_running() {

         running=`pgrep -f your_script.sh|wc -l `
    if [ $running -gt 1 ]; then
        echo "already running $0 -- instances found $running ";
      go=1;
}

check_running;
if [ $go -ge 1 ];then
      execute your other script
else
   sleep 120;
    check_running;
fi
于 2012-09-09T00:30:54.930 に答える