2012-09-08 7 views
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とその時私がスクリプトを実行しているとすれば、間違いなく確実に失敗するので、私の上記のスクリプトが失敗した場合に通知を受けて、間違ったことが起きたことを確かめることができます。

私の質問は十分に明確です。

ご意見をいただければ幸いです。

+0

@ Levon、Done。今それは良いですか? – ferhan

+0

はい、私はこれがはるかに良く見えると思う、潜在的なヘルパーを脅かすことはありません:) – Levon

+0

Yup ..アドバイスをありがとう。私は確かに次回を確かめるでしょう。 :) – ferhan

答えて

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 

もう一つの方法は、物事がprinting nothing unless an error ocurredのUnixの慣習に付着しているのcronによって呼び出されたスクリプトに間違って行くときに通知されることを確実にします。成功した実行は予告なしに実行され、実行に失敗するとcronデーモンは電子メールでエラーを通知します。これが機能するには、ローカルメール配信がシステム上で正しく構成されている必要があります。

5

すべてのUNIXコマンドラインユーティリティで、成功すると0を返し、失敗した場合は0を返します。したがって、$?最後の戻り値を表示し、それに応じて処理します。例えば

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

したがって、あなたは何かがうまくいかないかどうかを確認するために、このよう初歩的なエラー検出を使用することができます。だから、通常のアプローチは、他のスクリプトが同じマシン上にある場合が見つかった場合、その後、あなたはしばらくの間、睡眠と後の処理をされて再チェック他のスクリプトを試して、このスクリプトの他のスクリプトでpgrepコマンドを行うことができ

some_command 
if [ $? -gt 0 ] 
then 
handle_error here 
fi 
+4

実際にそれを書くための慣用方法は 'if! some_command;多くの人々は ''もし ''の唯一の目的がコマンドを実行し、成功または失敗のステータスの終了コードを調べることではないことを認識しているように見える。 – tripleee

0

良くなります行った。

スクリプトは、別のマシン上にある、あるいはローカル他の方法は、あなたはまた、いずれかのラップを完了でき

他のスクリプトが実行されている状態、すなわちを確認することができますことを実行している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 
関連する問題