web-dev-qa-db-ja.com

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

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

何か問題が発生した場合にのみCRONにメールを送信させることは可能ですか? TARが意図したとおりに実行されませんか?

当面の私のcrontabの設定方法は次のとおりです。

0 */2 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

どうもありがとう!

39
Industrial

理想的には、すべてが期待どおりに進んだ場合にバックアップスクリプトが何も出力せず、何かがうまくいかない場合にのみ出力を生成することが望ましいでしょう。次に、MAILTO環境変数を使用して、スクリプトによって生成された出力を電子メールアドレスに送信します。

[email protected]
0 */2 * * * /bin/backup.sh

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

[email protected]
0 */2 * * * /bin/backup.sh > /dev/null
56
Cakemox

cronic ラッパースクリプトを使用するのは良い考えのようです。これを使用するために、スクリプトを変更する必要はありません。

の代わりに:

 0 1 * * * /bin/backup.sh 2>&1 | mail -s "Backup status" [email protected]

行う:

 [email protected]
 0 1 * * * cronic /bin/backup.sh

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

https://habilis.net/cronic/ に関する詳細情報。

25
Ricardo Pardini

あなたは具体的にcronに、たとえ/bin/backup.sh(ちなみに、/usr/local/bin)成功します。 | mail -s "Backup status" [email protected]パーツとメールは、出力がある場合にのみ送信されます。おそらく、(cronに応じて)crontabファイルの割り当てとして、メール送信先のメールアドレスを明示的に設定できます。

詳細については、

man 5 crontab
4
reinierpost

stderrstdoutの両方ではなく、stderrを指示する必要があります。

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

3
Khaled

ここに私が長年うまく利用してきた別のバリエーションがあります-出力をキャプチャして印刷しエラー時にのみ、メールをトリガーします。これは一時ファイルを必要とせず、すべての出力を保存します。重要な部分は2>&1 STDERRを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" [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に出力した場合でも、電子メールを受信するためです。

3
Akom