cron で命令が実行された時,自動でメールが届く設定になっていることがほとんどだと思います.
エラーの時にメールが届くのはウェルカムなのですが,成功時のメッセージなどは別に届かなくていいよ…って思ってしまいます.
今回はエラーメッセージ以外ではメールが届かないようにしていきます.
1. 標準出力を捨てる
そもも,メールが届いてしまう原因は標準出力が出てしまっているからなので,これを捨ててしまえば基本的には OK です.
つまり,hoge
という命令をcron
に書く時には以下のように標準出力を /dev/null
にリダイレクトしておきます.
hoge 1>/dev/null
1>
は標準出力をリダイレクトするという意味で,標準エラー出力はそのまま表示されてエラーがある時にはメールが届くということになります.
これで,ほとんどの場合はメールが届かなくなると思います.
リダイレクトについて詳しくはこちらの記事などが参考になると思います.
2. curl
ではうまくいかない…?
curl
(命令を含む) 命令を実行していた場合にはそれでも以下のようなメールが届いてしまうことがあると思います.
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
0 0 0 0 0 0 0 0 --:--:-- --:--:-- --:--:-- 0
100 305 0 29 100 276 256 2442 --:--:-- --:--:-- --:--:-- 2699
標準出力は捨てているはずだし,手元で実行しても何も表示されないのに,cron
で実行すると届いてしまうのはなぜだ…となって調べていると,curl
ではパイプなどでリダイレクトするとプログレスメータが標準エラー出力に表示されてしまうようで,これを消さないといけないということに気づきました.
そこで,curl
命令を実行するところに -s
or --silent
オプションをつけてあげるとプログレスメータは表示されなくなりました.
curl -s https://hoge.hoge
他の命令でもプログレスメータが表示されてしまうことがあるかもしれないので,それぞれの命令を実行する時にオプションをつけてあげれば解決すると思います.
3. まとめ
cron
で成功時にもメールが届いてしまう場合はとりあえず標準出力を /dev/null
にリダイレクトしてあげれば OK ですが,curl
などプログレスメータが表示されてしまう命令の場合には命令を実行する時にプログレスメータを表示しないようにオプションをつけてあげる必要がありそうです.