はじめに
自宅サーバにてcron設定すると良く詰まるので調査手順を纏めました!
自分の見直し用でもあるので今後もエラー対応時に随時更新します!
前提情報
OS:ubuntu 20.04 LTS
- 「cron → bash → python」 の順で実行させたい
- bashの手動実行は正常に稼働する
- cronからの定期実行は実行されない
cronを使用する注意点
- 環境変数を使う場合は配慮
- 実行ユーザを配慮
- スクリプトも含めフルパスで記述
- スペルミス
cron.log出力
デフォルト設定ではcron.logは出力されないため下記の設定ファイルを編集しログを出力させる。
$ cd /etc/rsyslog.d
$ sudo vi 50-default.conf
(変更前)
#cron.* /var/log/cron.log
(変更後)
cron.* /var/log/cron.log
私の自宅サーバ環境では10行目にcron設定項目がありました。
cron設定の反映は下記コマンドでrsyslogを再起動時に行われます。
$ sudo systemctl restart rsyslog
cron.logは下記コマンドにて確認できます。
(ログ全数出力)
$ cat /var/log/cron.log
(最新10件の出力)
$ tail /var/log/cron.log
参考サイト
https://www.server-memo.net/ubuntu/ubuntu_cron_log.html
ログレベルの調整
cron.logを出力させるだけでは、メッセージ全件が出力されません。
そのため、エラーメッセージを出力するように下記の通り設定しログレベルを引き上げます。
$ sudo vi /etc/default/cron
(最終行を追加)
# This file has been deprecated. Please add custom options for cron using
# $ systemctl edit cron.service
# or
# $ systemctl edit --full cron.service
EXTRA_OPTS='-L 15' #追加
設定反映は下記コマンドでcronを再起動します。
$ sudo /etc/init.d/cron restart
エラー時は下記のようにcron.logに表示されます。
2行目のExit Codeが確認できたらExit Codeでググります。
- bashのExit Code一覧
https://qiita.com/Linda_pp/items/1104d2d9a263b60e104b
May 14 21:00:01 ubuntu CRON[23196]: (root) CMD ([23197] <<実行コマンド>>)
May 14 21:00:10 ubuntu CRON[23196]: (CRON) error (grandchild #23197 failed with exit status 1)
May 14 21:00:10 ubuntu CRON[23196]: (root) MAIL (mailed 1495 bytes of output but got status 0x004b from MTA#012)
May 14 21:00:10 ubuntu CRON[23196]: (root) END ([23197] <<実行コマンド>>)
スクリプトの標準出力
cronに設定しているスクリプトの標準エラーを出力させるように設定します。
* * * * * sudo sh /src/sample.sh >> /tmp/log/sample.log 2>&1
まとめ
何時間もエラー調査して結果的にスペルミスだったこともあるので、今一度スペルを確認すること!!!!!
(自戒の意味を込めて)