Linuxでcronが実行されない時の調査手順|ログ・環境変数・権限の3点を切り分ける

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOMELinux技術 リナックスマスター.JP(Linuxマスター.JP)Linuxtips, Linuxトラブルシューティング > Linuxでcronが実行されない時の調査手順|ログ・環境変数・権限の3点を切り分ける
「手動で実行すると動くのに、crontabに登録すると動かない」

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 自体が停止していないか確認する


「このままじゃマズい」と感じていませんか?
参考書を開く気力もない、同年代に取り残される不安——
でも安心してください。プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
図解60P/登録10秒/解除も3秒 / 詳細はこちら

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"

Ubuntu / Debian 系では crond ではなく 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) と表示されていれば正常です。inactivefailed の場合はサービスを起動します。

# 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つです。crontabの先頭にPATHを明記するか、スクリプト内のコマンドをすべてフルパスで書くかのどちらかです。後者のほうが移植性が高く、現場では推奨されます。

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

SELinuxが原因の場合は、スクリプトのコンテキストを適切なものに変更します。

# 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//' スクリプト名
cronのデバッグは「推測で直す」より「ログを読んで原因を特定する」が現場での鉄則です。まずは journalctl -u crond --since todaytail -50 /var/log/cron でログを確認し、証拠を見てから手を動かすようにしましょう。

ログの活用方法をさらに深めたい場合は、Linux 基本コマンドの解説 も参考にしてください。また、cronジョブをより細かく制御したい場合は、systemd timerへの移行も選択肢の一つです。systemd-analyze で起動時間計測 など、systemdの基本を理解しておくと管理の幅が広がります。

cronのトラブルを防ぐには、サーバー設計の「型」を知ることが近道です

cronが動かない原因の多くは「環境変数の設計」と「ログ確認の習慣」が身についていないことです。サーバー自動化の設計・cronの安全な使い方・ログ管理の仕組みを体系的に身につけることで、こうしたトラブルを未然に防げます。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

「独学の時間がもったいない」「プロから直接、現場の技術を最短で学びたい」という本気の方には、2日で実務レベルのスキルが身につく【初心者向けハンズオンセミナー】も開催しています。

無料メルマガで学習を続ける

Linuxの実践スキルをメールで毎週お届け。
登録は1分、解除もいつでも可。

登録無料・いつでも解除できます

暗記不要・1時間後にはサーバーが動く

3,100名以上が実践した「型」を無料で公開中

プロのエンジニアはコマンドを暗記していません。
「現場で使える型」を効率よく使いこなしているだけです。
その「型」を図解60Pにまとめた入門マニュアルを、完全無料でプレゼントしています。

登録10秒/合わなければ解除3秒 / 詳細はこちら

Linux無料マニュアル(図解60P) 名前とメールで30秒登録
宮崎 智広

この記事を書いた人

宮崎 智広(みやざき ともひろ)

株式会社イーネットマーキュリー代表。現役のLinuxサーバー管理者として20年以上の実務経験を持ち、これまでに累計3,100名以上のエンジニアを指導してきたLinux教育のプロフェッショナル。「現場で本当に使える技術」を体系的に伝えることをモットーに、実践型のLinuxセミナーの開催や無料マニュアルの配布を通じてLinux人材の育成に取り組んでいる。

趣味は、キャンプにカメラ、トラウト釣り。好きな食べ物は、ラーメンにお酒。休肝日が作れない、酒量を減らせないのが悩み。最近、ドラマ「フライトエンジェル」を観て涙腺が崩壊しました。