cron が動かない/実行されないときのチェックリスト

  • URLをコピーしました!

Linux の自動化でよく使われる cron
「手動でコマンドを打つと動くのに、cron に設定すると動かない…」という経験をした方は多いと思います。

本記事では、cron ジョブが実行されないときの チェックポイント3つ(パス設定・権限・ログ確認) を中心に、原因と解決方法をまとめます。

目次

1. パス設定の問題

症状

  • cron に書いたスクリプトが「コマンドが見つからない」となる
  • 手動では成功するのに、cron だと失敗する

原因

cron は 非常に制限された環境変数 で実行されます。
普段シェルで使っている /usr/local/bin$HOME/bin が PATH に含まれていないことが多いです。

解決方法

  1. フルパスでコマンドを書く * * * * * /usr/bin/python3 /home/user/script.py 「which コマンド」で実行ファイルのパスを確認してから書くのが確実です。
  2. スクリプトの先頭で PATH を指定 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin これを cron ファイルやシェルスクリプトに追記すると安定します。

2. 権限の問題

症状

  • cron ジョブは登録されているのに実行されない
  • ファイル書き込みが失敗している

原因

  • 実行ユーザーに権限がない
  • ファイルやディレクトリのパーミッション設定が不足している
  • root しか実行できないコマンドを一般ユーザーが実行している

解決方法

  • ジョブを登録しているユーザーを確認: crontab -l
  • スクリプトの実行権限を付与: chmod +x /home/user/script.sh
  • root 権限が必要な場合は sudo を付与するか、root の crontab に記載します。

3. ログ確認

症状

  • cron が「動いているのかすら分からない」

原因

cron は標準出力・標準エラーをメールで送る仕様ですが、メール環境が構築されていないと結果が見えません。

解決方法

  1. syslog / journalctl の確認
    • RHEL/CentOS: grep CRON /var/log/cron
    • Ubuntu/Debian: grep CRON /var/log/syslog
  2. ジョブの標準出力/エラーをログにリダイレクト * * * * * /home/user/script.sh >> /home/user/cron.log 2>&1 → 実際のエラー内容が分かるのでデバッグが楽になります。

4. その他の落とし穴

  • 環境変数がない
    .bashrc で設定している変数は引き継がれません。cron 内で明示的に設定が必要です。
  • 改行コードの違い
    → Windows で作成したスクリプトをそのまま使うと、CRLF が原因で実行されないことがあります。dos2unix コマンドで変換しましょう。
  • cron サービス自体が停止している systemctl status crond # RHEL系 systemctl status cron # Debian系

まとめ

cron が動かないときのチェックリスト:

  1. PATH 設定 → フルパスで記述 or PATH を指定
  2. 権限 → 実行ユーザーとパーミッションを確認
  3. ログsyslog やリダイレクトでエラー内容を確認

これらを押さえれば、ほとんどの「cron が動かない問題」は解決できます。

目次