
技術の仕事をしているわけでもないため、普段全くcron処理などをしない人生なのですが、とあるキッカケがありsyslog、cronを使うことになりました。基本的にはcronのログ設定なんてデフォルトでされてんだろうと思っていたのですが、違うみたいですね。cronの実験をしているのに全くログファイルが書き込まれず、悩んでいました。いままでの知識はなんだったのか…。
ということで、cron処理を行ったときのログファイルへの書き込み設定をまとめてみます。今後、使うことがあるのかわかりませんが。
最近ではcronではなくsystemdを使った方がいいようなことも目にするんですが実際のところはどうなんでしょうか。実務やっている方に聞いてみたいです。
【参考】
cronのログファイル出力の設定
cronのログファイル出力に関してはrsyslogで管理されているので、rsyslogの設定ファイルを記述して行っていきます。
$ sudo vi /etc/rsyslog.conf
ファイルを開いたら、以下を行をコメントアウトすればOKです。
変更前
#cron.* /var/log/cron.log

変更後
cron.* /var/log/cron.log

設定ファイルの変更が終わったら、rsyslogを以下のように再起動します。
$ sudo /etc/init.d/rsyslog restart

これで、cronのログが/var/log/cron.logに保存されるようになります。
ログレベルの設定
cronのログ出力が終わればこれで終わりかと思ったのですが、cron.logに追記されるログレベルの調整を行います。
設定は/etc/default/cronに記載を行います。以下のようにエディタでファイルを開いて
$ sudo vi /etc/default/cron
-Lオプションスイッチでレベルは数字で変更することになります。この設定は2進数のフラグ設定のようなので、
全てのログをログファイルに書き込んでほしい場合にはすべての数字を足した値15を-Lオプションであたえることで設定できます。
# For quick reference, the currently available log levels are: # 0 no logging (errors are logged regardless) # 1 log start of jobs # 2 log end of jobs # 4 log jobs with exit status != 0 # 8 log the process identifier of child process (in all logs) # EXTRA_OPTS='-L 15'

設定ファイルの変更を行ったらcronのサービスを再起動しておきます。
$ sudo /etc/init.d/cron restart

これでログレベルの設定は完了です。
ログの見方
こんなのメモしなくても常識だと思うのですが念の為。実は後者のやり方は知らなかったというか、オプションスイッチ指定するのだと思っていて、見当たらないなあと思っていたらこんな操作なんですね。
tailコマンドを使う
こればっかり使ってます。ファイルの更新があった場合に強制的に末尾を表示してくれます。
$ tail -f /var/log/cron.log
lessコマンドを使う
こちらはオプションスイッチをつけるのではなく、起動後のキー操作でtail -fと同じ機能行えます。
$ less /var/log/cron.log
lessコマンドを起動後して、ファイルの内容を表示している状態からF(Shift + f)を入力すると、監視モードへ移行します。
一応まとめておく
tail -f [ファイル名]less [ファイル名]、実行後にF(Shift + f)を押下
ログの内容
ログファイルにはcron処理の正常時・失敗時で以下のようなパターンでログに出力が行われます(-L 15設定時)。
cron処理成功時(実行コマンドがsh hoge.shの場合)
Nov 12 18:11:01 hostname CRON[13028]: (user) CMD ([13035] sh hoge.sh) Nov 12 18:11:13 hostname CRON[13028]: (user) END ([13035] sh hoge.sh)
cron処理失敗時(実行コマンドがsh hoge.shの場合)
Nov 12 18:10:01 hostname CRON[12968]: (user) CMD ([12975] sh hoge.sh) Nov 12 18:10:06 hostname CRON[12968]: (CRON) error (grandchild #12975 failed with exit status 1) Nov 12 18:10:06 hostname CRON[12968]: (user) END ([12975] sh hoge.sh)
実行に失敗するとチャイルドプロセス側のexitステータスも表示されます。
ログファイルにCLIから手動で書き込む方法
crontab -eで設定してもいいのですが、手動でログファイルに書き込む方法もあります。loggerコマンドを使用すれば書き込む事ができます。
loggerコマンドのフォーマット
logger -p 【ファシリティ】.【プライオリティ】 【メッセージ】
ファシリティはログの分類になっていて、/etc/rsyslog.confに定義されているファシリティに対応しています。
ファシリティ設定抜粋(/etc/rsyslog.conf)
auth,authpriv.* /var/log/auth.log *.*;auth,authpriv.none -/var/log/syslog cron.* /var/log/cron.log daemon.* -/var/log/daemon.log kern.* -/var/log/kern.log lpr.* -/var/log/lpr.log mail.* -/var/log/mail.log user.* -/var/log/user.log
プライオリティはemerg、alert、crit、err、warning、notice、info、debugなどがあります。
例えば、cron.logにerrのプライオリティで書き込むには以下のように実行すれば書き込みが行えます。
$ logger -p cron.err "Error Test"
![]()

おわりに
久々にcron関連について調べてみました。過去の知識もある程度アップデートしないとついていけないなあと思うのでした。
ちなみに、cron処理が失敗してメールが送れないよというエラーがcron.logに出力される場合にはcrontab -eで編集する設定ファイルにMAILTO=""を入れたほうがいいかも。(MTAインストールされていない可能性があるので)