エラーが発生した場合にのみ、cronからメールを受信するにはどうすればよいですか?
圧倒的に大多数のケースでは、タスクは問題なく実行されます-そして、私は本当に出力を気にしません。
私が知りたい、または知りたいと思っているのはまれなケースです。
私は procmail を利用できますが、私が説明しているものがcronの外部で「正しく」管理できるかどうかはわかりません。
出力を気にしないので、ジョブのSTDOUTを/dev/null
にリダイレクトし、STDERRをメールで送信できます(MAILTO
環境変数を使用)。
したがって、たとえば:
...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null
sTDERR(STDERRあり)のみに出力がある場合にメールを送信し、STDOUTを破棄します。
もちろん、これはプログラムがSTDERRに書き込んだときに失敗したことを前提としています。これは常に当てはまるとは限りません。プログラムを制御できる場合は、そのようにすることができます。複雑なケースでは、コマンドを実行してそれに応じてメールを送信する何らかのラッパーを作成する必要があります。そして、ラッパーをcron
ジョブとして配置します。
moreutils からのchronic
コマンドは、失敗しない限りコマンドを静かに実行します。
そのマニュアルからの引用:
chronicはコマンドを実行し、コマンドが失敗した(ゼロ以外の値を出力するかクラッシュする)場合にのみ、標準出力と標準エラーが表示されるように調整します。コマンドが成功した場合、無関係な出力は非表示になります。
慢性の一般的な用途は、cronジョブの実行です。コマンドを静かに保ち、成功したときに偶発的な出力を含むメールを処理し、失敗したときに出力が冗長にならないようにする必要はなく、常に冗長に実行し、chronicを使用して成功した出力を非表示にすることができます。
エラーが発生した場合にのみ、cronからメールを受信するにはどうすればよいですか?
cronic でcron呼び出しをラップできます。これは、呼び出されたプロセスの戻りコードがゼロ以外であるか、トレースエラー出力がない場合を除いて、cron出力を食べるシェルスクリプトです。
Cronicを使用するには、スクリプトを/usr/local/bin
などの適切な場所にダウンロードします。 cronic
が正しく設定されている場合は、crontabエントリの先頭にスクリプトへのパス(例:/usr/local/bin/cronic
)、または単にPATH
を付ける必要があります。
「エラー」は質問の中で明確に定義されていない用語であり、注意深く定義する必要があることに注意してください。クロニックが役立つためには、クロニックがエラー条件を定義する方法の1つでエラーを報告するジョブでラップするジョブを確認する必要があります。テキスト文字列をSTDOUT
に書き込むなどのレポートの暗黙的な方法では、これをクロニックまたは別のcronレポートメカニズムと互換性があるようにするために、さらに検討が必要になります。
クロニックサイトからリンクされている他のラッパーが利用可能です:
ここに私が長年うまく利用してきた別のバリエーションがあります-出力をキャプチャして出力しますエラー時のみ。これは一時ファイルを必要とせず、すべての出力を保持です。重要な部分は2>&1
STDERRをSTDOUTにリダイレクトします。
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" [email protected]
1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || {echo "$OUTPUT" ; ls -ltr /backup/dir ; }
これは単純なコマンドで機能します。複雑なパイプ(find / -type f | grep -v bla | tar something-or-other
)の場合は、コマンドをスクリプトに移動し、前述のアプローチを使用してスクリプトを実行することをお勧めします。その理由は、パイプのいずれかの部分がSTDERRに出力される場合でも、メールを受信するためです。
私はおそらくこれまでずっと考えていませんでしたが、
* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null
通常の場合、すべてを一時ファイルにリダイレクトし(おそらくmktemp
を使用して一意のファイル名を取得します)、ファイルが成功した場合はそれを削除し、次にcat
の内容を繰り返しますが、それらがまだ存在する場合(つまり、yourthing.shがエラー条件で終了した場合)は、cronメーラーによってピックアップされます。
メモリが確保されている場合、出力がないとcronはすでに何も送信しないため、ログファイルが空であるか存在しない場合は何も起こりません。 (エラーメッセージはリダイレクトされます。)