2016-05-23 3 views
0

私はいくつかのデータを移行するためのプログラムを実行するbashスクリプトを持っています。これは時間の約30-40%で失敗します。特定のエラーをキャッチしてスクリプトを再試行しますか? - BASH

この特定のエラーが発生したときにスクリプトを再試行する方法が必要ですが、失敗する前に3回試してみたいです。

それが失敗した場合、スクリプトは以下を出力します

Error: The connection to the remote server has timed out, no changes  have been committed. (#134 - scope: ajax_verify_connection_to_remote_site) 

編集:。具体的には....

migration.sh: 
#!/bin/bash 
various other scripts........ 
sudo a_broken_migration_program <Variables> 

私はそれが失敗した場合にのみ、理想的には、broken_migrationを数回再試行したいですこの特定のエラーが発生しますが、それが複雑すぎる場合は、すべてのエラーを再試行して解決します。これを行うには

+1

私の頭の上から離れて、主な移行ロジックをスクリプト内のbash関数に配置することをお勧めします。この関数は実際の移行プロセスの終了コードを返すことができます。また、関数の呼び出しを再試行するために、3つの制限付き単純ループを作成することができます。 – Lix

+1

"この特定のエラーが発生したときに再試行します"。他のエラーが表示されたら、引き続きお気軽にご連絡ください。 '$?'に格納されているシェルの戻りコードについて知っていますか?OKの場合は0、何らかのエラーがあった場合はゼロ以外の数字です。すべての良いコマンドはこの慣例を尊重すべきです。つまり、このQは掲示板ではありません。多くの人が投票に投票します。私たちはいくつかのコードを見る必要があり、問題をより具体的かつテスト可能にしています。がんばろう。 – shellter

+0

@shellter:非常に一般的なこの特定のエラーを除いて、すべてのエラーを停止したいと思います。なんらかの理由でこの移行ツールは非常に頻繁に失敗しますが、2回目または3回目には完全に完了します。 広すぎるとして、私はどのように具体化できるか分かりません..... 私はプログラムをシェルスクリプトから実行しています。私はこの特定のエラーをキャッチして、再試行したい。私はそれを明確にするために私のポストを更新します.... – James

答えて

2

は、ちょうどループであなたのコマンドを実行します。

#Loop until counter is 3 
counter=1 
while [[ $counter -le 3 ]] ; do 
     yourcommand && break 
     ((counter++)) 
done 

yourcommandが成功した場合、それがループを中断します。失敗した場合は、カウンタとループをインクリメントします。あなただけの特定のエラーコードに再試行したい場合は、カウンタが3

になるまで、あなたは、失敗した場合にエラーをキャプチャするコードをテストし、インクリメントできます

#Loop until counter is 3 
counter=1 
while [[ $counter -le 3 ]] 
do 
     #command to run 
     ssh [email protected] 

     rc=$? 
     [[ $rc -eq 255 ]] && ((counter++)) || break 
done 
この例では、へのSSHしようと

存在しない箱。変数$rcに戻りコード$?を取り込みます。 $rc255( "ssh:ホスト名compthatdoesntexistを解決できませんでした:名前またはサービスが不明です")の場合、カウンタおよびループをインクリメントします。その他の終了コードは、私たちをループから追い出す。

+0

恐ろしい私はそれが私が必要としていたものだと思います。最初のスニペットを試してみましたが、うまくいきました。エラーをキャッチして、エラーコードが何であるかを調べる必要があります。うまくいけば、開発者は異なる失敗のために異なるコードを使用することを選択したといいでしょう。さもなければ私はあなたの最初のスニペットにフェールバックする必要がありますが、私はそれができない場合、すべての失敗を再試行して生きることができると思います。再度、感謝します。 – James

関連する問題