Gitで実際のエラーが発生した場合にのみcron出力を電子メールで送信してください。

Gitで実際のエラーが発生した場合にのみcron出力を電子メールで送信してください。

あるサーバーには、別のサーバーからdoxygen出力を生成したいGitリポジトリがあります。次のコマンドは私には効果的ですが、Gitは進行状況を報告するためにstderrを使用しているため、リポジトリが更新されるたびに電子メールを送信する必要があるという欠点があります(完全なOracleによるクイック検索によると、この動作は機能と見なされます)現れました)。

59 * * * * cd FQNameOfRepo; git pull 1>/dev/null; make doc-all 1>/dev/null; cp doc/latex/refman.pdf doc/html/

grepGitのstderrを介して出力するか、既知の文字列と比較することができますが、これは間違っているようです。無効なGitコマンドを使用していますか?これを正しく行う方法は?

明確にすると、実際のエラーが発生したときにこのコマンドがメールを送信したいので、単にstderrをリダイレクトするだけでは役に立ちません。

答え1

crondの電子メール機能に過度に依存すると、さまざまな問題が発生する可能性があります。クローンによっては柔軟性が不十分な場合があります。

たとえば、説明したように、stdout / stderrメーリングをトリガーするように終了ステータス!= 0のみを設定することは通常不可能です。別の問題は、たとえば、Solaris crondのキャプチャ/メール出力に(相対的に)小さいサイズ制限があることです。

したがって、この場合は、コマンドを呼び出して出力を一時ログファイルにリダイレクトする小さなヘルパースクリプトを作成することをお勧めします。内部的には、すべてのプログラムの終了ステータスを追跡できます。そのうちの1つが!= 0の場合は、次のようにします。

  • 猫はログファイルをstdoutに送信します。
  • コマンドラインメールツールによるメール
  • または、ログファイルの場所を含む簡単な診断メッセージを出力します。

それは次のとおりです。

$ cat helper.sh
set -u
set -e

# setup log-file $LOG
# ...

cd FQNameOfRepo
set +e

git pull 1>/dev/null 2>> $LOG
r1=$?
make doc-all 1>/dev/null 2>> $LOG
r2=$?
cp doc/latex/refman.pdf doc/html/ 2>> $LOG
r3=$?

set -e

if [ $r1 -ne 0 -o $r2 -ne 0 -o $r3 -ne 0 ]; then
    # do some stuff, print/mail $LOG or something like that, etc.
    # ...
    exit 23
fi

答え2

出力を変数または一時ファイルに保存し、戻り状態がゼロ以外の場合にのみ印刷します。

59 * * * * errors=$( { cd FQNameOfRepo && git pull && make doc-all && cp doc/latex/refman.pdf doc/html/; } 2>&1 >/dev/null) || { ret=$?; echo "$errors"; exit $ret; }

(このやや長いジョークをスクリプトに入れることもできます。)

答え3

rsyslog を使用できます。メール出力モジュールがあります。 gitリポジトリで特定のエラーをキャッチして電子メールの宛先にルーティングするフィルタモジュールを設定します。

関連情報