Cron:メールでのみエラーが発生しますか?


38

最終的に、シェルスクリプトを使用してデータの現実的なバックアップスケジュールを設定しました。これは、短い間隔でcronによって処理されます。残念ながら、問題が発生したときだけでなく、CRONが実行されるたびに空のメールを受け取り続けます。

何か問題が発生した場合にのみCRONに電子メールを送信させることは可能ですか?私は、TAR意図したとおりに実行していないのですか?

現時点では、crontabのセットアップ方法は次のとおりです。

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

どうもありがとう!

回答:


53

理想的には、すべてが期待どおりに行われ、何か問題が発生した場合にのみ出力を生成する場合、バックアップスクリプトは何も出力しません。次に、MAILTO環境変数を使用して、スクリプトによって生成された出力を電子メールアドレスに送信します。

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh

スクリプトが通常出力を生成するが、cronでそれを気にしない場合は、/ dev / nullに送信するだけで、stderrに何かが書き込まれた場合にのみメールを送信します。

MAILTO=email@example.com
0 */2 * * * /bin/backup.sh > /dev/null

9
これはほとんど理想的ではありません。通常、コマンドがゼロ以外のエラーコードで終了した場合、出力全体(stdout + stderr)を電子メールで送信する必要があります。それ以外の場合、一般に少なくともstdoutを取得するのは問題ありません。私にとって、これはcronの設計上の欠陥です。
ウィティコ

3
@Witiko同意します。私はそれを修正しようとしてこの質問を見つけました。cronコマンドを作成できると思います/bin/backup.sh > log_file || (echo Backup failed with exit status $?; cat log_file)か?
ダニエルH

22

cronic wrapperスクリプトを使用するのは良いアイデアのようです。使用するためにスクリプトを変更する必要はありません。

の代わりに:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" email@example.com

行う:

 MAILTO=email@example.com
 0 1 * * * cronic /bin/backup.sh

簡単に言えば; すべてがスムーズに実行されると(終了ステータス0)サイレントモードで実行されますが、そうでない場合は詳細にレポートされ、cronがメールレポートを処理します。

https://habilis.net/cronic/の詳細情報。


問題が間違ったcron行にすぎず、cronが指示どおりに実行している場合、それがどのように役立つかは本当にわかりません。
ジョンガーデニアーズ

3
@JohnGardeniersは、エラーなしで出力できる場合があるので役立ちます。
ミハイル14

11
また、chronicからのmoreutilsパッケージ:joeyh.name/code/moreutils
ウラジミールPanteleev

4

あなたは(cronたとえそうであるにせよ)成功/bin/backup.shした場合でも、常に電子メールを送信するように具体的に指示しています/usr/local/bin| mail -s "Backup status" email@example.com部分を省略すると、出力がある場合にのみ電子メールが送信されます。(に応じてcron)crontabファイルで割り当てとしてメールを送信するメールアドレスを明示的に設定できます。

詳細については、

man 5 crontab

3

とのstderr両方stdoutではなくanmdを管理する必要がありstderrます。

使用し1> /dev/nullない2>&1でください。また、バックアップスクリプトでエラーを正しく報告する必要がある場合があります。


3

ここに私が長年使用して成功した別のバリエーションがあります-出力をキャプチャし、エラー時のみ印刷して、電子メールをトリガーします。これには一時ファイルは必要なく、すべての出力が保持されます。重要な部分は、2>&1STDERRをSTDOUTにリダイレクトすることです。

デフォルトのcronメーラー設定を介して出力全体を送信します。

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT"

同じですが、特定の住所と件名があります:

(アドレスは、crontabファイル全体にMAILTO = xxxxを設定することでも変更できます)

1 2 * * * root OUTPUT=`flexbackup -set all 2>&1` || echo "$OUTPUT" | mail -s "Failed to backup" an@email.address

エラー時に複数のアクションを実行し、メールに追加することもできます。

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に出力された場合でも、メールを受信できるからです。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.