cron ジョブが実行されないがログに出ないときの調査手順

  • URLをコピーしました!

Linux サーバーで定期的な処理を自動化するために利用される cron
しかし「設定したジョブが動かない」「ログに何も出ていない」という状況に直面することがあります。

本記事では、そんなときに確認すべき調査ポイントをステップごとに解説します。

目次

1. cron デーモンが稼働しているか確認する

まず基本中の基本として、cron サービス自体が起動しているかを確認します。

# systemctl status cron   # Debian/Ubuntu 系
# systemctl status crond  # RHEL/CentOS 系
  • active (running) になっているか確認
  • 止まっていれば起動 sudo systemctl start cron sudo systemctl enable cron

2. crontab の書式ミスを確認する

cron は書式に非常に厳格です。

  • 半角スペースの抜けや余分なスペースがないか
  • * の位置、分・時・日・月・曜日の並びが正しいか
  • /, の指定方法が間違っていないか
crontab -l

を実行して内容を再確認しましょう。

3. PATH など環境変数の影響を確認する

cron は 最小限の環境変数 しか読み込みません。
そのため、手動実行では動くスクリプトが、cron では動かないことがあります。

例:PATH が原因でコマンドが見つからないケース

#!/bin/bash
/usr/bin/python3 /home/user/script.py

のように 絶対パス を指定しましょう。

必要なら crontab の先頭に以下を追加:

PATH=/usr/local/bin:/usr/bin:/bin

4. 権限(ユーザー・実行権限)を確認する

  • cron ジョブを設定したユーザーが正しいか
  • 実行するスクリプトに 実行権限 (chmod +x) が付与されているか
  • root でしか動かせないコマンドを一般ユーザーで実行していないか
ls -l /home/user/script.sh

5. ログの出力先を明示する

cron は標準出力・標準エラーをメール送信する仕組みですが、環境によってはメールが無効化されている場合があります。

対策

cron の設定行にログ出力を明示的に追加:

* * * * * /home/user/script.sh >> /var/log/cron_script.log 2>&1

これで、エラー内容を直接確認可能です。

6. シェルの違いに注意する

cron のデフォルトシェルは /bin/sh(環境によっては dash)です。
普段 /bin/bash で動かしているスクリプトは、cron 上では動かない可能性があります。

対策として、スクリプト先頭に明記:

#!/bin/bash

7. 実行タイミングの確認(時間設定ミス)

  • サーバーの タイムゾーン が想定と異なる可能性あり
  • 0 0 * * * → UTC の 0 時(日本時間だと午前 9 時)になるケース
timedatectl

で確認しましょう。

8. SELinux や AppArmor の制限

セキュリティモジュールによって cron の実行がブロックされることもあります。

  • SELinux 有効時は /var/log/audit/audit.log を確認
  • 必要に応じてポリシーを緩和

まとめ:調査ポイント対応表

調査項目確認コマンド/対策よくある原因
cron デーモン稼働確認systemctl status cronサービスが停止している
crontab 書式確認crontab -lスペースや指定ミス
PATH 設定echo $PATH / 絶対パス記載cron の環境変数不足
権限確認ls -l script.sh実行権限なし/ユーザー不一致
ログ出力先指定>> /var/log/... 2>&1出力がメールで消失
シェル指定#!/bin/bashsh と bash の違い
タイムゾーン確認timedatectl時間設定のずれ
SELinux / AppArmor/var/log/audit/audit.logセキュリティ制御による拒否
目次