crontab から送信される電子メールの件名を指定したい

crontab で実行されたコマンドの出力はメールで送られますが，このときの件名は「Cron <ユーザ名@ホスト名> 実行コマンド」のようになります．

crontab 例

15 7 * * * echo "cron subject"

メール例

Subject: Cron <matoken@T430s> echo "cron subject"

cron subject

1つのhostからこんなメール飛んで来るとどれがどれかわかりづらい

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……

分かりづらいので自分で件名を付けたいところです．

Table of Contents

: を利用する

mailコマンドを利用する

STDERR が別メールで届く

出力がなくてもメールが届く

余録

cronで一切メールを送りたくない

指定したコマンドだけメールを送りたくない

メールが届かない

: を利用する

: は shell の組み込み関数で何もせず正常終了します．
コマンドなので # と違い，; の後にコマンドを書くとその後のコマンドは解釈されます．

$ : #何もしない
$ : hoge
$ : echo hoge
$ : rm -rf *
$ : $(hostname) #コマンドも展開せず何もしない
$ : `whoami`
$ : hoge; echo fuga #;の後は解釈される
fuga
$ # hoge
$ # hoge; echo fuga

これをcrontabの頭に書くとこういう感じになります．

crontab

29 6 * * * : cron subject; echo "hello"

mail

Subject: Cron <matoken@T430s> : cron subject; echo "hello"

hello

少しわかりやすくなりました．

mailコマンドを利用する

これはちょっと反則な感じがするのですが件名にコマンド実行結果を入れたり，頭の部分も書き換えたい場合はcronだけではできなさそうなのでmailコマンド経由で送信してみます．今回mailutilsのmailコマンドを利用しましたが，bsd-mailxやmutt等々ももちろん使えます．

crontab

45 6 * * * echo "cron test" | mail -s "$(hostname)@$(whoami) cron Subject : $(date +\%F)" matoken+cron@example.com

mail

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コマンドだけにします．

crontab

45 6 * * * echo "cron test" 2>&1 | mail -s "$(hostname)@$(whoami) cron Subject : $(date +\%F)" matoken+cron@example.com

出力がなくてもメールが届く

crontab の場合コマンドの出力がなければメールが送られませんが，このコマンドでは NULL でもメールが送信されます．
未解決．

余録

cronで一切メールを送りたくない

場合crontabで MAILTO=”” を設定する

MAILTO=""

指定したコマンドだけメールを送りたくない

STDOUT と STDERR を /dev/null に捨てる

20 6 * * * echo "cron subject" > /dev/null 2>&1

メールが届かない

/var/spool/mail/ユーザ名 のローカルにはメールがどとくけど，インターネット上のメールアドレスを指定しても届かない場合メールサーバの設定が出来ていないかもしれません．メールサーバ(sSMTP/msmtp等はデーモンが起動しないのでメールを受け取らず送信するだけならおすすめ)を設定してから再度試してみましょう．

環境1

$ 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

環境2

$ 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