cronのトラブルは、原因が3つのパターンにほぼ絞られます。ログの確認、環境変数の設定、実行権限の確認です。この3点を順番に切り分ければ、大半の問題は30分以内に解決できます。
この記事では、cronが実行されない時の原因切り分け手順を、実際のログ出力例を交えながら解説します。RHEL 9.4 / Ubuntu 24.04 LTSで動作確認済みです。
この記事のポイント
・cronのログを journalctl -u crond で即座に確認する
・「手動でOK・cronでNG」はほぼ PATH 未設定が原因
・実行権限(chmod +x)と行末の改行コードも必ず確認
・/var/log/cron が空なら crond 自体が停止していないか確認する
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
cronが「動かない」を構造で理解する
cronは crond(クーロンディー) というデーモンプロセスが、指定した時刻にコマンドを実行する仕組みです。通常のログインシェルとは切り離された「最小構成の環境」でコマンドが呼ばれるため、手動ではうまく動くスクリプトがcronでは失敗することがあります。原因は次の3点に集約されます。
・ログ:crondがエラーを記録しているが誰も見ていない
・環境変数:PATH や LANG がログインシェルと異なる
・権限:スクリプトに実行権限がない、またはファイルの所有者が違う
この3点を順に確認するだけで、現場のcronトラブルの9割は解決できます。
Step 1:ログを確認する
1. journalctlでcrondのログを見る
まず最初に確認すべきはログです。推測する前に証拠を探しましょう。RHEL 9 / Rocky Linux 9 / AlmaLinux 9 では以下のコマンドでcrondのログが確認できます。
# crondのログをリアルタイムで確認 # journalctl -u crond -f # 今日の実行履歴を確認 # journalctl -u crond --since today # 過去1時間のログを確認 # journalctl -u crond --since "1 hour ago"
cron サービス名になります。# Ubuntu / Debian系の場合 # journalctl -u cron --since today
2. /var/log/cron を直接確認する
RHEL系では/var/log/cron にも出力されます。ログを見ることで、実行を試みたがエラーになったのか、そもそも実行すらされていないのかを区別できます。# /var/log/cronを確認(RHEL系) # tail -50 /var/log/cron # 実際の出力例(RHEL9, sv01サーバー) Jun 15 10:00:01 sv01 CROND[2048]: (root) CMD (/root/backup.sh) Jun 15 10:00:01 sv01 CROND[2049]: (root) CMDEND CMD (/root/backup.sh)
CMD のログが出ていれば、crondはコマンドを起動しています。この後にエラーが続く場合はスクリプト自体の問題です。ログにCMDの記録がない場合は、crontabの書き方か、crondが停止している可能性があります。3. crondの起動状態を確認する
ログが一切出ない場合は、crondデーモン自体が停止していることがあります。# crondの状態確認(RHEL系) # systemctl status crond # Ubuntu系 # systemctl status cron # 実際の出力例(正常時) * crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled) Active: active (running) since Sun 2026-06-15 09:00:01 JST; 1h 23min ago
Active: active (running) と表示されていれば正常です。inactive や failed の場合はサービスを起動します。# crondを起動する(RHEL系) # systemctl start crond # 自動起動も設定する # systemctl enable crond
Step 2:環境変数を確認する
1. PATH が引き継がれない問題
cronで最もよくある原因です。ログインシェルでは/usr/local/bin や /home/user/bin などがPATHに含まれていても、cron環境では /usr/bin:/bin 程度しかありません。「手動でスクリプトを実行すると動くのに、cronだと動かない」のほとんどがこれです。
# NG例:コマンドのフルパスを指定していない 0 3 * * * /root/backup.sh # OK例:スクリプト内でフルパスを使う、またはcrontabにPATHを明示する PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0 3 * * * /root/backup.sh # OK例:スクリプト内のコマンドをフルパスで書く(移植性が高い) #!/bin/bash /usr/bin/python3 /root/process.py /usr/bin/rsync -av /data/ /backup/
2. LANG・文字コードの問題
日本語が含まれるファイル名やメール本文の処理がcronで文字化けする場合は、LANG 環境変数が原因です。# crontabにLANGを追加する LANG=ja_JP.UTF-8 PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin 0 3 * * * /root/backup.sh
3. ホームディレクトリの問題
~/.bashrc や ~/.bash_profile に書かれた設定はcronでは読み込まれません。スクリプトが ~/ のようなホームディレクトリの相対パスを使っている場合は絶対パスに変更してください。# NG:相対パスや~を使う cd ~/work && ./process.sh # OK:絶対パスを使う cd /root/work && ./process.sh
Step 3:権限を確認する
1. スクリプトの実行権限を確認する
スクリプトに実行権限がなければ、cronは起動してもPermission denied で失敗します。ログに Permission denied が出ている場合はこれが原因です。# 実行権限の確認 # ls -la /root/backup.sh -rw-r--r-- 1 root root 1234 Jun 15 09:00 /root/backup.sh # 実行権限を付与する # chmod +x /root/backup.sh # 確認 # ls -la /root/backup.sh -rwxr-xr-x 1 root root 1234 Jun 15 09:01 /root/backup.sh
2. ファイル所有者とcrontabのユーザーを一致させる
root の crontab に登録されているのに、スクリプトの所有者が別ユーザーになっている場合は実行に失敗することがあります。# 所有者の確認 # ls -la /var/scripts/backup.sh -rwxr-xr-x 1 appuser appuser 2048 Jun 15 09:00 /var/scripts/backup.sh # root crontabから呼ぶ場合は所有者をrootに変更するか # sudo実行を明示する # chown root:root /var/scripts/backup.sh
3. SELinuxが原因の場合
RHEL系でSELinuxがenforcing モードで動いている場合、スクリプトのコンテキストが合わないと実行を拒否されることがあります。# SELinuxの状態を確認 # getenforce Enforcing # /var/log/audit/audit.log でSELinuxの拒否ログを確認 # grep "avc.*denied" /var/log/audit/audit.log | grep crond | tail -10 # 実際の拒否ログ例(sv01サーバー, RHEL9) type=AVC msg=audit(1718412001.234:5678): avc: denied { execute } for pid=12345 comm="crond" path="/var/scripts/backup.sh" dev="sda1" ino=67890 scontext=system_u:system_r:crond_t:s0-s0:c0.c1023 tcontext=unconfined_u:object_r:var_t:s0 tclass=file permissive=0
# cronから実行するスクリプトのSELinuxコンテキストを設定 # chcon -t bin_t /var/scripts/backup.sh # または restorecon で正しいコンテキストに戻す # restorecon -v /var/scripts/backup.sh
よくあるその他のトラブル
1. 行末の改行コードが Windows 形式(CRLF)になっている
Windowsで作成したシェルスクリプトを転送した場合、行末が\r\n(CRLF)になっていることがあります。Linuxのbashは \r を認識できず、スクリプトが正常に動作しません。# 改行コードの確認(^Mが表示されればCRLF) # cat -A /root/backup.sh | head -3 #!/bin/bash^M$ # バックアップスクリプト^M$ # CRLFをLFに変換する # sed -i 's/\r//' /root/backup.sh # または dos2unix コマンドを使う # dos2unix /root/backup.sh
2. crontabの書式が間違っている
フィールドが5つ(分・時・日・月・曜日)あることを確認してください。空白は半角スペースかタブで区切ります。# crontabの書式 # 分 時 日 月 曜日(0=日曜) コマンド 0 3 * * * /root/backup.sh # 書式確認のコツ:crontab -e で保存後、crontab -l で確認する # crontab -l 0 3 * * * /root/backup.sh
3. 標準出力がメールで送信されてジョブが詰まる
cronはデフォルトで実行結果をメールで送信しようとします。メールサーバーが設定されていない環境では、メール送信が失敗してジョブが詰まることがあります。不要な出力はリダイレクトで捨てましょう。# 標準出力と標準エラーをすべて捨てる 0 3 * * * /root/backup.sh > /dev/null 2>&1 # ログファイルに保存する場合(こちらが現場推奨) 0 3 * * * /root/backup.sh >> /var/log/backup.log 2>&1
本記事のまとめ
| 症状 | 確認すべき項目 | 対処コマンド |
|---|---|---|
| ログにCMDすら出ない | crondが起動しているか | systemctl status crond |
| crontabの書式ミス | フィールドが5つあるか | crontab -l で確認 |
| CMDはあるがスクリプトが失敗 | 環境変数PATHの設定 | crontabにPATH明示 or フルパス使用 |
| Permission denied | 実行権限・SELinux | chmod +x スクリプト名 |
| 文字化け | LANG環境変数 | crontabに LANG=ja_JP.UTF-8 追加 |
| Windowsから転送後に動かない | 改行コード(CRLF) | sed -i 's/\r//' スクリプト名 |
journalctl -u crond --since today か tail -50 /var/log/cron でログを確認し、証拠を見てから手を動かすようにしましょう。ログの活用方法をさらに深めたい場合は、Linux 基本コマンドの解説 も参考にしてください。また、cronジョブをより細かく制御したい場合は、systemd timerへの移行も選択肢の一つです。systemd-analyze で起動時間計測 など、systemdの基本を理解しておくと管理の幅が広がります。
cronのトラブルを防ぐには、サーバー設計の「型」を知ることが近道です
cronが動かない原因の多くは「環境変数の設計」と「ログ確認の習慣」が身についていないことです。サーバー自動化の設計・cronの安全な使い方・ログ管理の仕組みを体系的に身につけることで、こうしたトラブルを未然に防げます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。
「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。
3,100名以上が実践した「型」を無料で公開中
プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。
登録10秒/合わなければ解除3秒 / 詳細はこちら
- 次のページへ:Linuxでファイルパス一覧から各ファイルを別フォルダへ一括移動する方法|while readループの実践
- 前のページへ:Linuxでディスクが容量不足になった時の対処手順|原因ファイルの特定から安全な削除まで
- この記事の属するカテゴリ:Linuxtips・Linuxトラブルシューティングへ戻る

無料メルマガで学習を続ける
Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。
登録無料・いつでも解除できます