Blog

cron の実行ログをすてさせないライフハックできたよー

昨今、cron のログにかんする話がちょいちょいありますが、問題点をまとめると

といったところかとおもいます。

これにたいする一般的なソリューションとして、かずほさんの 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)