cron・crontabが実行されない原因と確認手順
このページの目的
cronがジョブを呼び出す前の段階を確認します。最終的なゴールは、「登録されていない」「cronが動いていない」「時刻・書式が違う」「呼び出した後に失敗した」のどれかに分けることです。
最初にやること
最初に正しいユーザーのcrontabへ登録されているか、cronサービスが稼働しているか、予定時刻に実行記録があるかを確認します。実行記録があるなら、スクリプト側の失敗へ切り替えて調査します。
このページの対象:このページは「cronがジョブを呼び出していない」場合が中心です。cronの実行記録はあるのに処理だけ失敗する場合は、cronスクリプトが失敗するガイドを確認してください。
cron設定を作成・確認
実行時刻とコマンドを入力して、cron式と確認ポイントを整理できます。
最初に実行記録の有無を確認する
予定時刻のログを確認し、調査の入口を決めます。
- 実行記録がない:登録先、時刻、書式、cronサービスを確認
- 実行記録がある:cronは呼び出しているため、標準エラー、実行ユーザー、PATH、権限を確認
crontab -l
systemctl is-active crond || systemctl is-active cron
journalctl -u crond --since today --no-pager || journalctl -u cron --since today --no-pager
よくある表示・症状から原因を絞る
表示された文言は原因そのものではなく、確認範囲を絞る手掛かりです。「考えられる原因」と「最初の確認方法」を対応させて確認します。
| エラー・症状 | 考えられる原因 | 最初の確認方法 |
|---|---|---|
command not found | PATH不足、またはコマンド名・配置場所の誤り | command -v で実体を確認し、crontabでは絶対パスを使用 |
Permission denied | スクリプトの実行権限、出力先権限、親ディレクトリの通過権限不足 | id と namei -l で実行ユーザーと対象パスを確認 |
No such file or directory | 相対パス、shebang、参照ファイル、CRLF改行などの不一致 | pwd、head -1、file で実行環境とファイル形式を確認 |
bad minute / errors in crontab file | cron式のフィールド数・値・記号などの書式誤り | 登録時のメッセージと crontab -l の該当行を確認 |
CRON ... CMD (...) はあるが処理結果がない | cronの起動までは成功し、コマンドまたはスクリプト内部で失敗している | 標準出力・標準エラーをファイルへ保存し、終了コードを確認 |
ログに実行記録がない | 別ユーザーへ登録、cronサービス停止、時刻・タイムゾーン条件の不一致 | 対象ユーザーのcrontab、systemctl status、時刻・タイムゾーンを確認 |
原因を切り分ける確認手順
登録内容を確認する
crontab -l sudo crontab -u appuser -l別ユーザーのcrontabへ登録していないか、保存できているか確認します。
cronデーモンを確認する
systemctl is-active crond || systemctl is-active cron停止している場合は、起動前にサービスログで原因を確認します。
同じユーザーで手動実行する
sudo -u appuser /opt/scripts/backup.sh手動でも失敗するなら、cronではなくスクリプトや権限の問題です。
絶対パスと出力先を指定する
cronはログインシェルより環境変数が少ないため、まずコマンドと出力先を絶対パスにして再実行します。
/usr/bin/python3 /opt/app/job.py >> /var/log/app/job.log 2>&1PATHの決まり方やcrontab内での設定例は、cronでPATHが通らない原因と対策に分離しています。
cronのログを確認する
journalctl -u crond --since today --no-pager journalctl -u cron --since today --no-pagerディストリビューションによっては
/var/log/cronやsyslogにも記録されます。
cron特有の環境差
| 項目 | 注意点 |
|---|---|
| PATH | 対話シェルより短いことがあります。絶対パスまたはcrontab内のPATHを使います。 |
| カレントディレクトリ | 期待したディレクトリとは限りません。スクリプト内でcdするか絶対パスを使います。 |
| 環境変数 | シェル初期化ファイルが通常は読み込まれません。必要な値を明示します。 |
% | 実装によってコマンド部分の未エスケープ%が改行として扱われるため、必要なら\%とします。 |
/etc/cron.d | 時刻フィールドの後に実行ユーザー欄が必要です。 |
この症状で多い原因
- ユーザーcrontabへ実行ユーザー欄を追加している、または
/etc/cron.dでユーザー欄がない - 相対パスやシェルのaliasに依存している
- スクリプトに実行権限や正しいshebangがない
- 出力先ディレクトリへ書き込めない
- サーバーのタイムゾーンや曜日条件を誤認している
/etc/cron.dのファイル名・所有者・末尾改行が実装要件を満たしていない
修正後の確認と再発防止
検証中は一時的に短い間隔へ変更するより、テスト専用の無害なジョブを使うほうが安全です。
* * * * * /usr/bin/date >> /tmp/cron-test.log 2>&1
確認後はテストジョブを必ず削除してください。本番処理を毎分に変更すると、重複実行や負荷増加を起こすことがあります。