web-dev-qa-db-ja.com

ファイルと電子メールを送信するcronjobstderr

一部のファイルで引き続きエラーを出力するには、cronジョブが必要ですが、同時に電子メールで送信する必要もあります。それはいくつかのトリックなしでは不可能のようです。

私は this を見つけましたが、助けにはなりませんでした。

それを行う最も簡単な方法は何でしょうか?

7
Bastien974

私があなたの質問を正しく理解しているなら、あなたはエラー(出力ではない)をログファイルに送り、そしてそれらを電子メールで送りたいと思うでしょう。

これを行うには、teeとstdout/stderrリダイレクトの組み合わせを使用します。

cron(8) のマンページによると、cronがメールを処理できます。この努力を不必要に複製する必要はありません。

コマンドを実行すると、出力はcrontabの所有者(または、crontabのMAILTO環境変数で指定されているユーザー(存在する場合))にメールで送信されます。

ここでの秘訣は、STDERRをログファイルと電子メールに送信することですが、STDOUTには送信しません。次の例は、これを行う方法を示しています。

スクリプトが次のコマンドを実行するとします。 ls tmp/fooが成功したため、この出力はSTDOUTに送られます。 ls tmp/barはエラーを生成するため、この出力はSTDERRに送信されます。

$ ls tmp/foo tmp/bar
ls: tmp/bar: No such file or directory
tmp/foo

次のcronジョブはSTDOUTを非表示にしますが、STDERRを/var/log/test.logにリダイレクトします。

* * * * * ls tmp/foo tmp/bar 2>&1 >/dev/null | tee -a $HOME/var/log/test.log

結果は次のとおりです。電子メールと〜/ var/log /test.logはどちらも同じことを言います。

メールの本文には次のように書かれています。

ls: tmp/bar: No such file or directory

ログファイルには同じことが書かれています。

$ cat ~/var/log/test.log
ls: tmp/bar: No such file or directory

追加のボーナスとして、STDERRとSTDOUTをログファイル(たまにしか見ない)に送信することもできますが、STDERRを画面(手動で実行する場合)または電子メール(cronから実行する場合)に送信します。長時間実行されるビルドスクリプトには、次のスニピットを使用します。

{ { ./configure && make && make install ; } >> $LOGFILE ; } 2>&1 | tee -a $LOGFILE
8

teeを使用します:

MBPro-ABustardo:~ abustardo$ echo foo |tee tmp  
foo

MBPro-ABustardo:~ abustardo$ cat tmp  
foo

あなたの場合:

[your script] 2>&1 |tee [some local local file] |mail -s [subject] [email protected]
2
Aimon Bustardo

これはあなたの質問に答えますか? https://stackoverflow.com/questions/1396506/cron-send-email-with-stderr-but-not-stdout

Cronは、/dev/nullに指示されない限り、実行のたびに電子メールを送信することになっています。

0
sreimer