cron: job not running
cronジョブが期待通りに実行されない場合の原因と対策
概要
cronに登録したジョブが期待した時間に実行されない、または実行されても正常に動作しない問題です。cron特有の環境(PATH、シェル、環境変数)が原因であることが多く、ターミナルでは動作するのにcronでは動かないケースが頻繁に発生します。
エラーメッセージ
cronジョブが実行されない場合、直接的なエラーメッセージは表示されないことが多いですが、以下のログで確認できます。
# /var/log/syslog または /var/log/cron
CRON[12345]: (myuser) CMD (/opt/app/backup.sh)
CRON[12345]: (CRON) error (grandchild #12346 failed with exit status 1)
/bin/sh: /opt/app/backup.sh: Permission denied
/opt/app/backup.sh: line 3: node: command not found
原因
- PATH環境変数が異なる: cronは最小限のPATH(
/usr/bin:/bin)しか持たない - crontab構文のエラー: スケジュール書式の間違い
- 実行権限がない: スクリプトにchmod +xしていない
- 環境変数が未設定:
.bashrcや.profileが読み込まれない - cronデーモン自体が停止している: サービスが起動していない
解決策
1. cronデーモンの稼働確認
| |
2. crontab構文の確認
| |
# crontab書式
# 分 時 日 月 曜日 コマンド
# 0-59 0-23 1-31 1-12 0-7(0,7=日)
# 毎日午前3時に実行
0 3 * * * /opt/app/backup.sh
# 5分ごとに実行
*/5 * * * * /opt/app/healthcheck.sh
# 月〜金の9時に実行
0 9 * * 1-5 /opt/app/report.sh
3. フルパスを使用する
| |
4. 環境変数とPATHを明示的に設定
# crontabの先頭で環境変数を定義
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
HOME=/home/myuser
NODE_ENV=production
0 3 * * * /opt/app/backup.sh
または、スクリプト内でPATHを設定:
| |
5. ログ出力を設定して問題を特定
# 標準出力とエラー出力をファイルに記録
0 3 * * * /opt/app/backup.sh >> /var/log/backup.log 2>&1
# メール通知を抑制(出力が不要な場合)
0 3 * * * /opt/app/backup.sh > /dev/null 2>&1
# cronのメール送信先を設定
MAILTO=admin@example.com
0 3 * * * /opt/app/backup.sh
6. 手動でcron環境をシミュレーション
| |
関連エラー
Linux の他のエラー
この記事は役に立ちましたか?