web-dev-qa-db-ja.com

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

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

圧倒的に大多数のケースでは、タスクは問題なく実行されます-そして、私は本当に出力を気にしません。

私が知りたい、または知りたいと思っているのはまれなケースです。

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

12
warren

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

したがって、たとえば:

...
...
[email protected]
...
...
* * * * * /my/script.sh >/dev/null

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

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

8
heemayl

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

そのマニュアルからの引用:

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

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

11

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

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

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

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

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

8

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

4
Akom

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

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

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

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

0
Ulrich Schwarz