超いまさらcron設定を行ってみました

f:id:ueponx:20211005000919p:plain

技術の仕事をしているわけでもないため、普段全くcron処理などをしない人生なのですが、とあるキッカケがありsyslogcronを使うことになりました。基本的にはcronのログ設定なんてデフォルトでされてんだろうと思っていたのですが、違うみたいですね。cronの実験をしているのに全くログファイルが書き込まれず、悩んでいました。いままでの知識はなんだったのか…。

ということで、cron処理を行ったときのログファイルへの書き込み設定をまとめてみます。今後、使うことがあるのかわかりませんが。

最近ではcronではなくsystemdを使った方がいいようなことも目にするんですが実際のところはどうなんでしょうか。実務やっている方に聞いてみたいです。

【参考】

qiita.com

cronのログファイル出力の設定

cronのログファイル出力に関してはrsyslogで管理されているので、rsyslogの設定ファイルを記述して行っていきます。

$ sudo vi /etc/rsyslog.conf

ファイルを開いたら、以下を行をコメントアウトすればOKです。

変更前

#cron.*                          /var/log/cron.log

f:id:ueponx:20211004235335p:plain

変更後

cron.*                          /var/log/cron.log

f:id:ueponx:20211004235353p:plain

設定ファイルの変更が終わったら、rsyslogを以下のように再起動します。

$ sudo /etc/init.d/rsyslog restart

f:id:ueponx:20211004235626p:plain

これで、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'

f:id:ueponx:20211004235928p:plain

設定ファイルの変更を行ったらcronのサービスを再起動しておきます。

$ sudo /etc/init.d/cron restart

f:id:ueponx:20211005000042p:plain

これでログレベルの設定は完了です。

ログの見方

こんなのメモしなくても常識だと思うのですが念の為。実は後者のやり方は知らなかったというか、オプションスイッチ指定するのだと思っていて、見当たらないなあと思っていたらこんな操作なんですね。

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.logerrのプライオリティで書き込むには以下のように実行すれば書き込みが行えます。

$ logger -p cron.err "Error Test"

f:id:ueponx:20211005003355p:plain

f:id:ueponx:20211005003400p:plain

おわりに

久々にcron関連について調べてみました。過去の知識もある程度アップデートしないとついていけないなあと思うのでした。

ちなみに、cron処理が失敗してメールが送れないよというエラーがcron.logに出力される場合にはcrontab -eで編集する設定ファイルにMAILTO=""を入れたほうがいいかも。(MTAインストールされていない可能性があるので)