cron の処理が期待どおりに動かないときの対処方法まとめ
cron の処理が思いどおりに動かないときの対処方法についてかんたんにまとめます。
cron の基礎知識
以下 cron を利用する上での前提知識です。
- cron ではシェルのスタートアップスクリプトが通常読み込まれない
- 結果としてシェルで通常利用できる環境変数やコマンドが利用できないことがある
そのため、 cron を正しく使用するには「コマンドはフルパスで指定する」「必要な環境変数は明示的に渡す」ことが必要です。
cron がうまく動かないときの対処方法
cron が思いどおりに動かないときの対処方法です。
- 問題を切り分ける
- 問題を解決する
最初に必要なのは問題の切り分けです。 原因を正確に特定するために原因の範囲を絞り込みます。 例えば以下のポイントをチェックすると原因の特定が進みます。
- A) 対象の処理は実行されているか?
- B) 処理の実行時にエラーは出ていないか?
A) はそもそも処理がトリガーされているかどうかのチェックです。
crontab で設定した設定ファイルの記述が間違っている場合や環境変数 PATH
の不足で対象のコマンドが見つからない場合は、そもそも処理が実行されないということが起こりえます。
B) は A) のポイントが大丈夫だったときに次にチェックすべきポイントです。 ターミナルで直接実行したらうまく動くのに cron では動かない場合は「実行ユーザー」や「関連するファイルのパーミッション」「環境変数」あたりの違いをチェックするとよいです。
環境変数の違いをチェックしたいときは /usr/bin/env
コマンドを cron で試しに実行するとすぐにわかります。
対象のコマンドそのものがログファイルにログを吐くようになっている場合はそちらもチェックします。
また、設定で MAILTO=""
としている場合は、デバッグ中だけでも有効なメールアドレスに変更するとよいです。
ちなみに私が cron 周りでハマったことがある落とし穴は次のとおりです。
- cron の設定ファイルの書式を間違っていた
- コマンドをフルパスで指定していなかった
- cron の実行ユーザーがログファイルの書き込み権限を持っていなかった
- 環境変数
LANG
が cron でのみLANG=C
となっており日本語を含むファイルの読み込みでエラーが発生していた
以上です。
基本中の基本ではありますが、設定ミス等でときどきハマって時間を浪費してしまいます。 つい先日ハマったばかりなのでこの機会にとまとめておきました。 cron でハマるどなたかの参考になればと思います。