技術の仕事をしているわけでもないため、普段全く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インストールされていない可能性があるので)