cron の実行結果をメールを送信するとき、結果の1行目をタイトルにする
2024/10/05 15:32
crontab の MAILTO にメールアドレスが指定されているとき、cron job の実行によって標準出力に出力があればその内容がメール送信されますが、そのときの Subject は job のコマンドの文字列となります。これだと、メールのタイトルとしてはわかりにくい(メールの内容を自然言語で説明しているものではない)ものになります。
そこで、標準出力の1行目を Subject に指定する方法を考案しました。
| ( msg=$(cat); test -z "$msg" && exit; echo "$msg" | mail -s "`echo \"$msg\" | awk 'NR==1{printf $0}'`" "$MAILTO"
これをコマンドの右側に追記します。
具体的には crontab で次のように記述します。
1 2 * * * (echo "Disk consumption `date --iso-8601=minutes`"; df -h) | ( msg=$(cat); test -z "$msg" && exit; echo "$msg" | mail -s "`echo \"$msg\" | awk 'NR==1{printf $0}'`" "$MAILTO" )
これで毎日 2:01 am に Subject が 'Disk consumption (日付+時刻)' であるメールが届きます。この例だと mail コマンドの -s オプションに直接記述すればよいのであまりありがたみがありませんが、外部のスクリプトを呼び出すときや、出力が1行のみのコマンドを実行させるときには役に立ちます。
なお crontab で SHELL と PATH が次のように指定されているのが前提です。
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
mail コマンドは mail (GNU Mailutils) 3.17 を使用しています。