crontab で実行されたコマンドの出力はメールで送られますが,このときの件名は「Cron <ユーザ名@ホスト名> 実行コマンド」のようになります.
15 7 * * * echo "cron subject"
Subject: Cron <matoken@T430s> echo "cron subject" cron subject
Cron <matoken@T430s> nice -n 19 ionice -c 3 rsync -avxze "ssh -i…… Cron <root@T430s> nice -n 19 ionice -c 3 rsync -avxze "ssh -i…… Cron <root@T430s> nice -n 19 ionice -c 3 rsync -avxze "ssh -i……
分かりづらいので自分で件名を付けたいところです.
: を利用する
: は shell の組み込み関数で何もせず正常終了します.
コマンドなので # と違い,; の後にコマンドを書くとその後のコマンドは解釈されます.
$ : #何もしない $ : hoge $ : echo hoge $ : rm -rf * $ : $(hostname) #コマンドも展開せず何もしない $ : `whoami` $ : hoge; echo fuga #;の後は解釈される fuga $ # hoge $ # hoge; echo fuga
これをcrontabの頭に書くとこういう感じになります.
29 6 * * * : cron subject; echo "hello"
Subject: Cron <matoken@T430s> : cron subject; echo "hello" hello
少しわかりやすくなりました.
mailコマンドを利用する
これはちょっと反則な感じがするのですが件名にコマンド実行結果を入れたり,頭の部分も書き換えたい場合はcronだけではできなさそうなのでmailコマンド経由で送信してみます.今回mailutilsのmailコマンドを利用しましたが,bsd-mailxやmutt等々ももちろん使えます.
45 6 * * * echo "cron test" | mail -s "$(hostname)@$(whoami) cron Subject : $(date +\%F)" matoken+cron@example.com
Subject: T430s@matoken cron Subject : 2018-09-13 X-Mailer: mail (GNU Mailutils 3.4) cron test
mail コマンドの -s オプション部分が件名になります.その後ろが宛先のメールアドレス.bodyはcronの出力をパイプから受け取ります.
STDERR が別メールで届く
STDERR の出力があった場合cronでメールが送られてしまいます.mailコマンドと合わせて1度に2通届くことに.
実行コマンドの後ろに 2>&1 を付けて STDERR を STDOUT に渡してmailコマンドだけにします.
45 6 * * * echo "cron test" 2>&1 | mail -s "$(hostname)@$(whoami) cron Subject : $(date +\%F)" matoken+cron@example.com
出力がなくてもメールが届く
crontab の場合コマンドの出力がなければメールが送られませんが,このコマンドでは NULL でもメールが送信されます.
未解決.
余録
cronで一切メールを送りたくない
MAILTO=""
指定したコマンドだけメールを送りたくない
20 6 * * * echo "cron subject" > /dev/null 2>&1
メールが届かない
/var/spool/mail/ユーザ名 のローカルにはメールがどとくけど,インターネット上のメールアドレスを指定しても届かない場合メールサーバの設定が出来ていないかもしれません.メールサーバ(sSMTP/msmtp等はデーモンが起動しないのでメールを受け取らず送信するだけならおすすめ)を設定してから再度試してみましょう.
$ man cron | grep -m1 cron cron - daemon to execute scheduled commands (Vixie Cron) $ dpkg-query -W cron mailutils cron 3.0pl1-128.1ubuntu1 mailutils 1:3.4-1 $ lsb_release -d Description: Ubuntu 18.04.1 LTS $ uname -m x86_64
$ man cron | grep -m1 cron cron - 予定されたコマンドを実行するデーモン(Vixie Cron) $ dpkg-query -W cron mailutils cron 3.0pl1-130 mailutils 1:3.4-1+b1 $ lsb_release -d Description: Debian GNU/Linux unstable (sid) $ uname -m x86_64