cron の実行ログをすてさせないライフハックできたよー
昨今、cron のログにかんする話がちょいちょいありますが、問題点をまとめると
- stdout or stderr に1バイトでも書くとメールがとぶ
- インタープリタのだす warnings や printf デバッグの名残りなどでもメールがいちいちとんでめんどくさい
- めんどくさいから出力を /dev/null にほうむりがち
- ログを /dev/null にすてると運用にさしつかえる
といったところかとおもいます。
これにたいする一般的なソリューションとして、かずほさんの cronlog というのがあって、これは exit status をみて stdout/stderr の出力を /dev/null または任意のファイルにおくってメールをとばさせないというソリューションです。
cronlog は便利なのだけど、毎行設定するのだるいという問題があるので、設定が簡単なように cron に以下のようなパッチをあてるのはどうでしょうか。
[email protected] FAIL_MAIL_ONLY=1
とか先頭にかいておくだけで、exit status 0 のときはメールおくらない仕様になって便利。
diff --git a/do_command.c b/do_command.c index 18d097d..4834908 100644 --- a/do_command.c +++ b/do_command.c @@ -129,7 +129,7 @@ child_process(e, u) int stdin_pipe[2]; FILE *tmpout; register char *input_data; - char *usernm, *mailto; + char *usernm, *mailto, *fail_mail_only; int children = 0; pid_t job_pid; @@ -153,6 +153,7 @@ child_process(e, u) */ usernm = env_get("LOGNAME", e->envp); mailto = env_get("MAILTO", e->envp); + fail_mail_only = env_get("FAIL_MAIL_ONLY", e->envp); /* Check for arguments */ if (mailto) { @@ -523,6 +524,8 @@ child_process(e, u) getpid(), (long) pos)) if (pos == 0) goto mail_finished; + if (fail_mail_only && *fail_mail_only && status == 0) + goto mail_finished; // get name of recipient. if (mailto == NULL)