cron実行でエラー時のみメール送信させる

ALL
スポンサーリンク

cron を使用するに際し、次のような不満点があります。

  • cronのログ(/var/log/cron)では、cron で実行した各コマンドの成功/失敗は分からない
  • cron は出力を受け取ると MAILTO に指定されたアドレスに、その内容をメールする。
    通常の出力内容もメールされてしまう。

特に、エラーでもないのにメール送信されてくることが煩わしいですが、cron実行結果のログを捨てる訳にもいきません。
過去には次のようなツイートも話題になりました。

fujiwaraさんのツイート: “crontabに > /dev/null 書いたら椅子投げる”

cron実行では、次のようなことができたら嬉しいですね。

  • cron実行での出力内容(標準出力とエラー出力両方共)はファイルにログ出力する。
  • cron実行でエラーだった場合のみ、実行結果(標準出力とエラー出力両方共)をメール通知する。

そこで、これらが出来る cronlog を使います。

準備・インストール

cron 実行での出力内容は、設定ファイル(/tec/crontab等)の MAILTO行で指定されたアドレスにメール送信されます。
必要に応じて MAILTO を記述しておきます。

次に cronlog をダウンロード・ビルドします。

wget https://github.com/kazuho/kaztools/archive/master.zip
unzip master.zip
cd kaztools-master
perl Makefile.PL && make && make test

最後に Result: PASS と表示されれば OK です。

インストールします。

sudo make install

実行

下記書式で、cron で実行します。

/usr/local/bin/cronlog --logfile=ログファイル --timestamp -- コマンド

指定した”コマンド”の出力内容(標準出力とエラー出力両方)は、”ログファイル”で指定したファイルに、タイムスタンプ付きで追加出力(append)されます。

以下のような出力です。
XXXXX の箇所にはホスト名が入ります。

[Wed Oct 11 15:05:07 2017] XXXXX starting: sh test.sh
[Wed Oct 11 15:05:07 2017] success
[Wed Oct 11 15:05:07 2017] error
[Wed Oct 11 15:05:07 2017] error2
[Wed Oct 11 15:05:07 2017] success2
[Wed Oct 11 15:05:07 2017] command exited with code:250

“コマンド”の実行が失敗(リターンコードが0以外)なら、ファイルに出力したものと同じ内容を標準出力にも出力します。
オプションに –print-always を付けると、”コマンド” の成功/失敗に関わらず、常に標準出力に出力されます。

これらの標準出力への出力内容は cronによって、 crontabの先頭の MAILTO で指定されたアドレスにメール送信されます。

その他実行例

cronlog --timestamp -- コマンド

コマンドが失敗した時のみ、出力結果をメール送信します。
ファイルには残りません。

cronlog --logfile=ログファイル --timestamp -- コマンド

コマンドの実行結果をファイル出力します。また失敗した時は、出力結果をメール送信します。

cronlog --timestamp --print-always -- コマンド

コマンドの実行結果をいつもメール送信します。
ファイルには残りません。

cronlog --logfile=ログファイル --timestamp --print-always -- コマンド

コマンドの実行結果をいつもファイル出力&メール送信します。

参考

Kazuho@Cybozu Labs: crontab を使って効率的にサービス監視する方法

コメント