web-dev-qa-db-ja.com

スクリプトがエラーをスローしたときにcronにエラーログ付きのメールを送信させる方法は?

SQLデータベースのエラーチェックを書き込み、エラーをログファイルに書き込むスクリプトを実行するcronジョブがあります。ログファイルは、スクリプトを実行するコマンドで提供されます。スクリプトでエラーが検出された場合にのみ電子メールを受信し、ログを電子メールに含めたい。スクリプトでエラーが見つからない場合、メールを受け取りたくありません。どうやら、スクリプトはエラーを検出した場合も検出しなかった場合もログに書き込みます(このスクリプトは記述していません)。

    20 6-10 * * 1-5 ~/job_failure_test.sh -o ~/job_fail.log 2>&1 /dev/null | mail -s "Errors" [email protected] < ~/job_fail.log

これまでのところ、この行は、ログにエラーが書き込まれたときにメールを送信しますが、更新されたログは送信しません。前回のcronジョブの実行のログが送られてきます。

4
linuxuser

ただ変える| (a pipe )to || (スクリプト or )(スクリプトが終了コードを適切に使用していると想定)エラー時にのみ出力するようにスクリプトを変更し、これを実行することをお勧めします。

[email protected]
[email protected]
20 6-10 * * 1-5 ~/job_failure_test.sh

醜い方法。

20 6-10 * * 1-5 ~/job_failure_test.sh > ~/job_fail.log 2>&1 || mail -s "Errors" [email protected] < ~/job_fail.log
9
user1133275

この機能はcronに組み込まれています!コマンドが出力を生成する場合、またはコマンドがゼロ以外のステータスを返す場合、cronはメールを送信します。

最新のディストリビューションの多くは、ローカルメールをセットアップしていません。ない場合は、メール転送エージェント(MTA)をインストールします。たとえば、 this thread Ubuntuの場合、または cronの場合にローカルでメールを配信する最小限のMTA? 最小限の機能が必要な場合。または、EximやPostfixなどの一般的なMTAをインストールして、ローカル配信専用に構成します(たとえば、 this thread を参照)。ローカルメールを設定したら、お気に入りのメールクライアントでローカルメールを読むことができます。

メールをローカルで読む代わりに、ファイルを作成できます ~/.forward には外部のメールアドレスが含まれており、ローカルのメールはすべてそこに転送されます。転送を選択する場合は、外部にメールを送信できるMTA(“ smarthost ”)が必要です。

または、crontabでMAIL変数を設定して、メールをそのアドレスに直接送信します。これも、システムが外部に電子メールを送信できる必要があります。