エラーがない限り、cronメールを無効にしますか?


12

エラーがある場合にのみcronからメールを受信するにはどうすればよいですか?

圧倒的多数の場合、タスクは問題なく実行され、出力については本当に気にしません。

私が知りたい/必要とするのは、まれな障害の場合のみです。

私はprocmailを利用できますが、説明していることをcronの外部で「正しく」管理できるかどうかはわかりません。


crond自体が実行されていない場合はどうなりますか?または、マシンはオフラインですか?だから私は決してcronからのメールに煩わされず、専用のcron監視サービスを使用します。私はWDT.ioに不満なので、お勧めします。
クリスチャンペケラー

回答:


8

出力を気にしないので、ジョブのSTDOUTをリダイレクトし/dev/null、STDERRをメールで送信できます(MAILTO環境変数を使用)。

したがって、たとえば:

...
...
MAILTO=foobar@example.com
...
...
* * * * * /my/script.sh >/dev/null

STDERR(STDERRのみ)にのみ出力がある場合にメールを送信し、STDOUTを破棄します。

もちろんこれは、プログラムがSTDERRに書き込んだときに失敗したと想定しています。これは常に当てはまるとは限りません。プログラムを制御できる場合は、そのようにすることができます。複雑な場合は、コマンドを実行してメールを送信する何らかの種類のラッパーを作成する必要があります。そして、ラッパーをcronジョブとして配置します。


1
このアプローチの欠点は、失敗するとSTDERR出力しか得られないため、完全な出力が得られた場合よりも診断が難しくなる可能性があることです。
プラグウォッシュ

10

moreutilschronicコマンドは、失敗しない限り静かにコマンドを実行します。

マニュアルから引用:

chronicはコマンドを実行し、コマンドが失敗した場合(ゼロ以外の終了またはクラッシュ)にのみ表示されるように、その標準出力と標準エラーを調整します。コマンドが成功すると、無関係な出力は非表示になります。

慢性の一般的な用途は、cronジョブの実行です。コマンドを静かに保ち、成功した場合に偶発的な出力を含むメールを処理する必要があり、失敗した場合に十分な出力を表示するのではなく、常に冗長に実行し、慢性を使用して成功した出力を非表示にすることができます。


8

エラーがある場合にのみcronからメールを受信するにはどうすればよいですか?

cron呼び出しをcronicでラップすることができます。cronicは、呼び出されたプロセスの戻りコードがゼロでない場合、またはトレースエラー出力がない場合を除き、cron出力を食べるシェルスクリプトです。

cronicを使用するには、スクリプトをなどの適切な場所にダウンロードします/usr/local/bin。crontabエントリには、スクリプトへのパスを接頭辞として付ける必要があります(例:)/usr/local/bin/cronic、または単にcronicPATH適切に設定されている場合。

「エラー」はあなたの質問で定義されていない用語であり、慎重に定義する必要があることに注意してください。cronicを有効にするには、エラー条件を定義する方法の1つでcronicレポートエラーでラップするジョブを確認する必要があります。にテキスト文字列を書き込むなどの暗黙的なレポート方法では、STDOUTこれをcronicまたは別のcronレポートメカニズムと互換性を持たせるためにさらに検討する必要があります。

cronicサイトからリンクされている他のラッパーが利用可能です:


1
cronic関連していchronicますか、それとも単なる偶然ですか?
トビースパイト

@TobySpeight偶然の一致。以前の回答で提案されているように、Perlスクリプトがcronicbashで実装chronicされてます。
コスミックオシファージュ

4

ここで私は成功し、多くの年のために利用したこと別のバリエーションである-キャプチャ出力は、それをプリントアウトするだけでエラーに。これには一時ファイルは必要なく、すべての出力が保持されます。重要な部分は、2>&1STDERRをSTDOUTにリダイレクトすることです。

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

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"
G-Manが「Reinstate Monica」と言う

@ G-Manフェアポイント、出力に「-n」などが含まれる可能性が常にあります。
Akom

0

私はおそらくこれをずっと考えていませんでしたが、

* * * * * yourthing.sh >/tmp/yourthing.log && rm -f /tmp/yourthing.log; cat /tmp/yourthing.log 2>/dev/null

通常の場合、すべてを一時ファイルにリダイレクトし(おそらくmktemp一意のファイル名を取得するために使用します)、ファイルが成功した場合は削除しcat、まだ存在する場合は内容を削除します(つまり、yourthing.shが終了しました)エラー条件付き)、cronメーラーによって取得されます。

メモリが提供される場合、出力がなかった場合、cronはすでに何も送信しません。そのため、ログファイルが空であるか存在しない場合は、何も起こりません。(エラーメッセージをリダイレクトします。)

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