エラーがある場合にのみcronからメールを受信するにはどうすればよいですか?
圧倒的多数の場合、タスクは問題なく実行され、出力については本当に気にしません。
私が知りたい/必要とするのは、まれな障害の場合のみです。
エラーがある場合にのみcronからメールを受信するにはどうすればよいですか?
圧倒的多数の場合、タスクは問題なく実行され、出力については本当に気にしません。
私が知りたい/必要とするのは、まれな障害の場合のみです。
回答:
出力を気にしないので、ジョブのSTDOUTをリダイレクトし/dev/null
、STDERRをメールで送信できます(MAILTO
環境変数を使用)。
したがって、たとえば:
...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null
STDERR(STDERRのみ)にのみ出力がある場合にメールを送信し、STDOUTを破棄します。
もちろんこれは、プログラムがSTDERRに書き込んだときに失敗したと想定しています。これは常に当てはまるとは限りません。プログラムを制御できる場合は、そのようにすることができます。複雑な場合は、コマンドを実行してメールを送信する何らかの種類のラッパーを作成する必要があります。そして、ラッパーをcron
ジョブとして配置します。
moreutilsのchronic
コマンドは、失敗しない限り静かにコマンドを実行します。
マニュアルから引用:
chronicはコマンドを実行し、コマンドが失敗した場合(ゼロ以外の終了またはクラッシュ)にのみ表示されるように、その標準出力と標準エラーを調整します。コマンドが成功すると、無関係な出力は非表示になります。
慢性の一般的な用途は、cronジョブの実行です。コマンドを静かに保ち、成功した場合に偶発的な出力を含むメールを処理する必要があり、失敗した場合に十分な出力を表示するのではなく、常に冗長に実行し、慢性を使用して成功した出力を非表示にすることができます。
エラーがある場合にのみcronからメールを受信するにはどうすればよいですか?
cron呼び出しをcronicでラップすることができます。cronicは、呼び出されたプロセスの戻りコードがゼロでない場合、またはトレースエラー出力がない場合を除き、cron出力を食べるシェルスクリプトです。
cronicを使用するには、スクリプトをなどの適切な場所にダウンロードします/usr/local/bin
。crontabエントリには、スクリプトへのパスを接頭辞として付ける必要があります(例:)/usr/local/bin/cronic
、または単にcronic
、PATH
適切に設定されている場合。
「エラー」はあなたの質問で定義されていない用語であり、慎重に定義する必要があることに注意してください。cronicを有効にするには、エラー条件を定義する方法の1つでcronicレポートエラーでラップするジョブを確認する必要があります。にテキスト文字列を書き込むなどの暗黙的なレポート方法では、STDOUT
これをcronicまたは別のcronレポートメカニズムと互換性を持たせるためにさらに検討する必要があります。
cronicサイトからリンクされている他のラッパーが利用可能です:
cronic
関連していchronic
ますか、それとも単なる偶然ですか?
ここで私は成功し、多くの年のために利用したこと別のバリエーションである-キャプチャ出力は、それをプリントアウトするだけでエラーに。これには一時ファイルは必要なく、すべての出力が保持されます。重要な部分は、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" 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に出力された場合でも、メールを受信できるからです。
$OUTPUT
引用符で囲む必要があります"$OUTPUT"
。
私はおそらくこれをずっと考えていませんでしたが、
* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null
通常の場合、すべてを一時ファイルにリダイレクトし(おそらくmktemp
一意のファイル名を取得するために使用します)、ファイルが成功した場合は削除しcat
、まだ存在する場合は内容を削除します(つまり、yourthing.shが終了しました)エラー条件付き)、cronメーラーによって取得されます。
メモリが提供される場合、出力がなかった場合、cronはすでに何も送信しません。そのため、ログファイルが空であるか存在しない場合は、何も起こりません。(エラーメッセージをリダイレクトします。)