cronが実行しているスクリプトで一時的なエラーを無視する方法は?

cronが実行しているスクリプトで一時的なエラーを無視する方法は?

ヘッドレスサーバー(Ubuntu 14.04)のcronで通常毎日実行されるさまざまなバックアップスタイルスクリプトがあります。 Cronには、ジョブに関するフィードバックを受け取るようにメールサーバーが構成されています。通常、これらのバックアップスクリプトはstdout / stderr出力なしで正常に実行されるように書かれています(「ニュースがないのは良いニュースです」という標準のUnixパラダイムに従う)、多くの迷惑メールで電子メールの受信トレイが詰まらないようにします。

時にはこれは失敗し、stdout / stderr出力を含む電子メールをただちに受け取ります。しかし、これらの失敗はしばしば既知の原因、特に寿命が短い(つまり、翌日再び消える可能性があります)。たとえば、私のインターネット接続が少し不安定で、時にはリモートDNS解決が失敗します(この問題の目的によってはこの問題を解決できないと仮定します)。もちろん、これを事前に予測することはできないため、動作周波数を下げることはできません。

特定のタスクを超えた場合にのみcronが失敗するようにしたいと思います。N試してみるかしばらくしてから解決する必要がある「永続的な」エラーの報告のみを受け取ります。それは可能ですか?

私はUbuntu 14.04でcron 3.0pl1-124ubuntu2を使用しています。私は他のcronのようなソフトウェアに開いていますが、より一般的な答え(スクリプトの周りにラッパーを置くことができます)は他の人にとって非常に便利です。確信している。

私が考慮したオプション:

  • これを処理するためにスクリプト自体にロジックを統合することは1つのオプションですが、より一般的なものを探していました。一部のスクリプトはbashで、一部はPythonなどです。さらに、スクリプト内のすべてのstdout / stderrが実際にラッパー関数に存在する必要があるため、状況はかなり複雑になります。
  • 継続的な統合サーバーを使用してください。ジェンキンス私のタスクの実行を処理します。より強力で、私が探している種類のプラグインを提供できますが、管理する方がはるかに複雑で少し重い(JVMが必要)、Unix-yではありません。
  • 理由なく- リモートバックアップなどを再試行するため、リソースを消費し、予期しないDoSを引き起こす可能性があるため、やや積極的です。元の計画どおりにcronジョブを再試行したいです。

答え1

多くの日にわたってエラーを追跡しようとしているので、基本的に問題を記録する必要がありますが、これらの「ログ」はユーザーに関連する必要はなく、cronjobに対してのみ隠すことができます。スクリプトをラップするのが正しい選択のようです。

maxAttempts=5

if [ -f ~/.script_fails ];then #determine the number of failures
    failures=$(cat ~/.script_fails)
else
    failures=0
fi

if [ $failures -lt $maxAttempts ];then #determine if failures exceeds max attempts
    ./script.sh > /dev/null #if so, get rid of output
else
    ./script.sh #otherwise keep it
fi

result=$?

if [ $result -eq 0 ];then #increment or remove counter
    rm ~/.script_fails
else
    failures=$failures + 1
    echo $failures > ~/.script_fails
fi

これは、ロギングを維持または無視する必要がある時期を決定し、非常に簡単です。失敗回数を追跡するために使用されるファイルはホームディレクトリに隠されているため、必要に応じて確認できますが、失敗回数が高すぎないとメールには何も表示されません。

しかし、Jenkinsを使用することをお勧めします。一度設定すると、作業がはるかに簡単になります。

答え2

私は今、私自身の問題を解決するためにラッパーユーティリティを作成し始めました。クロマー。これで基本的な形式で実行されます。すべての貢献/プールの要求/問題などを歓迎します。

関連情報