インフラ作業支援ラボInfra Support Lab ← ガイド一覧← 戻る
問題発生時のトラブル解決ガイド

cron・crontabが実行されない原因と確認手順

このページの目的

cronがジョブを呼び出す前の段階を確認します。最終的なゴールは、「登録されていない」「cronが動いていない」「時刻・書式が違う」「呼び出した後に失敗した」のどれかに分けることです。

最初にやること

最初に正しいユーザーのcrontabへ登録されているか、cronサービスが稼働しているか、予定時刻に実行記録があるかを確認します。実行記録があるなら、スクリプト側の失敗へ切り替えて調査します。

このページの対象:このページは「cronがジョブを呼び出していない」場合が中心です。cronの実行記録はあるのに処理だけ失敗する場合は、cronスクリプトが失敗するガイドを確認してください。

cron設定を作成・確認

実行時刻とコマンドを入力して、cron式と確認ポイントを整理できます。

cron設定ツールを使う
登録時にbad minuteが出る場合:ユーザーcrontabとシステム用のフィールド差、エラー行、不可視文字、登録前検証をcrontab bad minute専用ガイドで確認してください。

最初に実行記録の有無を確認する

予定時刻のログを確認し、調査の入口を決めます。

crontab -l systemctl is-active crond || systemctl is-active cron journalctl -u crond --since today --no-pager || journalctl -u cron --since today --no-pager

systemctl / journalctlがない既存環境では、service・init scriptと/var/log/cron・/var/log/syslogなど、その環境のサービス管理・syslog構成に読み替えます。

よくある表示・症状から原因を絞る

表示された文言は原因そのものではなく、確認範囲を絞る手掛かりです。「考えられる原因」と「最初の確認方法」を対応させて確認します。

エラー・症状考えられる原因最初の確認方法
command not foundPATH不足、またはコマンド名・配置場所の誤りcommand -v で実体を確認し、crontabでは絶対パスを使用
Permission deniedスクリプトの実行権限、出力先権限、親ディレクトリの通過権限不足id と namei -l で実行ユーザーと対象パスを確認
No such file or directory相対パス、shebang、参照ファイル、CRLF改行などの不一致pwd、head -1、file で実行環境とファイル形式を確認
bad minute / errors in crontab filecron式のフィールド数・値・記号などの書式誤り登録時のメッセージと crontab -l の該当行を確認
CRON ... CMD (...) はあるが処理結果がないcronの起動までは成功し、コマンドまたはスクリプト内部で失敗している標準出力・標準エラーをファイルへ保存し、終了コードを確認
ログに実行記録がない別ユーザーへ登録、cronサービス停止、時刻・タイムゾーン条件の不一致対象ユーザーのcrontab、systemctl status、時刻・タイムゾーンを確認

crontabの「bad minute」が出る場合

bad minute は、cron式の先頭にあるminute(分)フィールドや行構造を正しく解釈できないときに出る代表的なエラーです。まずminuteの値が0〜59の範囲か、フィールド数や記号が正しいか、全角文字・不可視文字が混ざっていないかを確認します。その後、ユーザーcrontabと /etc/crontab・/etc/cron.d の形式差も確認します。

確認例
ユーザーcrontab*/5 * * * * /opt/job.sh
/etc/cron.d*/5 * * * * appuser /opt/job.sh
crontab -l sudo crontab -u appuser -l sed -n '1,120p' /etc/crontab ls -l /etc/cron.d/

ユーザーcrontabは「時刻5項目+コマンド」、/etc/crontab・/etc/cron.dは「時刻5項目+実行ユーザー+コマンド」です。形式を混同すると別の実行エラーにつながることもあるため、bad minuteだけに限定せず行全体を確認します。登録前にcron設定ツールで基本構文と値範囲をレビューできます。

原因を切り分ける確認手順

  1. 登録内容を確認する

    crontab -l sudo crontab -u appuser -l

    別ユーザーのcrontabへ登録していないか、保存できているか確認します。

  2. cronデーモンを確認する

    # systemd環境 systemctl is-active crond || systemctl is-active cron

    停止している場合は、起動前にサービスログで原因を確認します。

    既存環境・旧来の運用手順:SysV init系やsystemctlを使わない環境では、service crond status、service cron status、環境によっては/etc/init.d/crond statusで状態を確認します。利用できる管理方式を確認してから操作してください。
  3. 同じユーザーで手動実行する

    sudo -u appuser /opt/scripts/backup.sh

    手動でも失敗するなら、cronではなくスクリプトや権限の問題です。

  4. 絶対パスと出力先を指定する

    cronはログインシェルより環境変数が少ないため、まずコマンドと出力先を絶対パスにして再実行します。

    /usr/bin/python3 /opt/app/job.py >> /var/log/app/job.log 2>&1

    PATHの決まり方やcrontab内での設定例は、cronでPATHが通らない原因と対策に分離しています。

  5. cronのログを確認する

    journalctl -u crond --since today --no-pager journalctl -u cron --since today --no-pager

    ディストリビューションによっては/var/log/cronやsyslogにも記録されます。 cronログの確認方法を詳しく見る

cron特有の環境差

項目注意点
PATH対話シェルより短いことがあります。絶対パスまたはcrontab内のPATHを使います。
カレントディレクトリ期待したディレクトリとは限りません。スクリプト内でcdするか絶対パスを使います。
環境変数シェル初期化ファイルが通常は読み込まれません。必要な値を明示します。
%実装によってコマンド部分の未エスケープ%が改行として扱われるため、必要なら\%とします。
/etc/cron.d時刻フィールドの後に実行ユーザー欄が必要です。

この症状で多い原因

確認結果から次の対応を決める

確認結果対処
対象ユーザーのcrontabに登録されていない実行させるユーザーを確定し、crontab -e / crontab -u USER -e で正しい登録先へ追加します。system crontabを使う場合はユーザー欄を含む書式にします。
bad minute など構文エラー該当行の分・時・日・月・曜日を修正し、全角空白や不要な文字も除去します。修正後に crontab -l で保存内容を再確認します。
cronサービスが停止している停止理由と直前ログを確認したうえで、設定・依存先の問題を直してからサービスを起動します。原因未確認のまま再起動だけで済ませません。
実行記録はあるが処理結果がないcron自体は起動しているため、cronは実行されるがスクリプトが失敗する場合へ切り替え、PATH・権限・作業ディレクトリ・標準エラーを確認して修正します。
時刻・タイムゾーンが想定と違うOSとcronが参照する時刻・タイムゾーンを確認し、運用要件に合わせてスケジュールを修正します。
ポイント:「cronが動かない」と「cronは動いたがジョブが失敗した」は別問題です。実行記録が確認できた時点で、cron設定をむやみに変更せずスクリプト側の調査へ移ります。

修正後の確認と再発防止

検証中は一時的に短い間隔へ変更するより、テスト専用の無害なジョブを使うほうが安全です。

* * * * * /usr/bin/date >> /tmp/cron-test.log 2>&1
確認後はテストジョブを必ず削除してください。本番処理を毎分に変更すると、重複実行や負荷増加を起こすことがあります。

cron設定を作成・確認

実行時刻とコマンドを入力して、cron式と確認ポイントを整理できます。

cron設定ツールを使う