cronのログを確認する方法|/var/log/cronとjournalctl -u crondでエラーを特定

宮崎智広 この記事の監修:宮崎智広(Linux実務・教育歴20年以上・受講者3,100名超)
HOME > Linux技術 リナックスマスター.JP(Linuxマスター.JP) > Linuxtips > cronのログを確認する方法|/var/log/cronとjournalctl -u crondでエラーを特定
「cronで設定したジョブが動いていないみたいだけど、どこを見ればいいんだろう」

cronのスケジュール設定は正しいはずなのに、ジョブが実行されていない。そんなとき、最初に確認すべきなのがcronのログファイルです。

この記事では、cronのログファイル(/var/log/cron)の確認方法から、journalctlを使ったsystemd環境での調査、ログが出力されないときのトラブルシュートまでを解説します。
RHEL 9 / CentOS 7 / Rocky Linux 9 / Ubuntu 24.04 LTSで動作確認しています。

この記事のポイント

・cronのログは /var/log/cron(RHEL系)、Ubuntu系は /var/log/syslog で確認できる
・grep でジョブ名・ユーザー・時間帯の絞り込みが可能
・systemd環境では journalctl -u crond(RHEL系)/ -u cron(Ubuntu系)が有効
・ログが出ない場合はrsyslog設定とcronデーモンの稼働状態を確認する

この記事で扱うのは「cron が 実行した結果のログ」の確認方法です。「crontab -e で編集した 履歴」を探している場合は、後半のFAQで /var/spool/cron/ のタイムスタンプ確認方法も紹介します。


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

cronのログを確認する理由

cronはバックグラウンドで動作するデーモンです。設定した時刻にジョブが実行されたかどうかは、ターミナル上には何も表示されません。

つまり、ジョブの実行結果を確認する手段はログしかありません。

cronのログを確認することで、以下のことがわかります。

・ジョブが実行されたか:指定した時刻にCMDエントリが記録されているか
・どのユーザーで実行されたか:ログに実行ユーザー名が記録される
・crontabが編集されたか:crontab -e による変更がREPLACEとして記録される
・異常終了していないか:エラー発生時の手がかりになる

なお、cronログはあくまで「コマンドが起動されたこと」の記録であり、コマンドの実行結果(成功・失敗・エラーメッセージ)は別途リダイレクト先のファイルを確認する必要があります。ジョブの出力確認については後述のフォーマット解説で触れます。

cronの設定方法そのものについては、crontabコマンドの設定と書き方を参照してください。本記事では「設定したジョブが動いているかどうか」をログで確認する方法に集中します。

/var/log/cron でログを確認する基本操作

RHEL系(CentOS、Rocky Linux、AlmaLinux)では、cronのログは /var/log/cron に出力されます。Ubuntu/Debianでは専用ファイルが作られず、/var/log/syslog に他のサービスログと混在します(Ubuntuでの確認方法は後述のFAQも参照してください)。

1. tail で最新のログを確認する

まずは末尾の数行を確認するのが基本です。

# 末尾10行を表示する(デフォルト) # tail /var/log/cron # 末尾の行数を指定して表示する(-n オプション) # tail -n 50 /var/log/cron Nov 14 11:58:01 Tiger CROND[3132]: (pcp) CMD ( /usr/libexec/pcp/bin/pmie_check -C) Nov 14 12:00:01 Tiger CROND[3692]: (root) CMD (/usr/lib64/sa/sa1 1 1) Nov 14 12:00:01 Tiger CROND[3693]: (root) CMD (/usr/share/clamav/freshclam-sleep) Nov 14 12:01:02 Tiger CROND[3715]: (root) CMD (run-parts /etc/cron.hourly) Nov 14 12:01:02 Tiger CROND[3717]: (root) CMD (/var/www/system/snortsnarf.sh) Nov 14 12:01:02 Tiger run-parts(/etc/cron.hourly)[3715]: starting 0anacron Nov 14 12:01:03 Tiger anacron[3731]: Anacron started on 2017-11-14 Nov 14 12:01:03 Tiger run-parts(/etc/cron.hourly)[3733]: finished 0anacron Nov 14 12:01:03 Tiger run-parts(/etc/cron.hourly)[3715]: starting 0yum-hourly.cron Nov 14 12:01:03 Tiger run-parts(/etc/cron.hourly)[3739]: finished 0yum-hourly.cron Nov 14 12:01:03 Tiger anacron[3731]: Will run job `cron.daily' in 15 min. Nov 14 12:01:03 Tiger anacron[3731]: Will run job `cron.weekly' in 35 min. Nov 14 12:01:03 Tiger anacron[3731]: Will run job `cron.monthly' in 55 min. Nov 14 12:01:03 Tiger anacron[3731]: Jobs will be executed sequentially

直近30分の動きを確認したい場合は tail -n 50、深夜バッチが問題の場合は tail -n 200 など、状況に応じて行数を増やしてください。

2. tail -f でリアルタイム監視する

ジョブの実行タイミングをリアルタイムで確認したい場合は、tail -f を使います。

# cronログをリアルタイムに監視する # tail -f /var/log/cron # cronログとシステムログを同時に監視する(複数ファイル指定) # tail -f /var/log/cron /var/log/messages

Ctrl+C で監視を終了できます。複数のファイルを同時に指定した場合は ==> ファイル名 <== というヘッダーで、どのファイルに書き込まれたかを区別しながら表示されます。tail -f の詳しい使い方はtail -fコマンドでログをリアルタイムに監視する方法を参照してください。

3. cat や less で全体を確認する

ログファイル全体を確認したい場合は less を使います。

# less /var/log/cron

less では / キーで文字列検索、q キーで終了できます。ファイルが大きい場合は cat より less の方が扱いやすいでしょう。

cronログのフォーマットを理解する

cronログの各行は、以下の形式で記録されます。

Nov 14 12:00:01 Tiger CROND[3692]: (root) CMD (/usr/lib64/sa/sa1 1 1)

それぞれのフィールドの意味は以下のとおりです。

・Nov 14 12:00:01:実行日時(月 日 時:分:秒)
・Tiger:ホスト名
・CROND[3692]:cronデーモンのプロセスID(PID)
・(root):ジョブを実行したユーザー名
・CMD (...):実際に実行されたコマンド

【注意】cronログには「コマンドが起動された」という記録だけが残ります。コマンドの実行結果(成功・失敗)やエラーメッセージはcronログには記録されません。ジョブの標準出力・標準エラー出力を確認するには、crontabの設定でリダイレクト先を指定しておく必要があります。

# crontab設定でログをリダイレクトする例 0 3 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1

grepでcronログを絞り込む

cronログには大量のエントリが記録されるため、目的の情報を素早く見つけるには grep による絞り込みが欠かせません。

1. 特定のコマンドで絞り込む

# grep "backup.sh" /var/log/cron Apr 5 03:00:01 server01 CROND[12345]: (root) CMD (/usr/local/bin/backup.sh) Apr 5 03:00:01 server01 CROND[12347]: (root) CMD (/usr/local/bin/backup.sh)

2. 特定のユーザーで絞り込む

# grep "(webapp)" /var/log/cron Apr 5 01:00:01 server01 CROND[9876]: (webapp) CMD (/home/webapp/cleanup.sh)

3. crontabの編集履歴を確認する

誰かがcrontabを編集した場合、ログに「REPLACE」というエントリが記録されます。

# grep "REPLACE" /var/log/cron Apr 4 15:32:10 server01 crontab[5678]: (admin) REPLACE (admin)

この記録から、いつ・誰がcrontabを変更したかを特定できます。本番環境でジョブが突然動かなくなった場合、まずREPLACEの履歴を確認するのが実務上の鉄則です。

4. 特定の時間帯で絞り込む

# grep "Apr 5 03:" /var/log/cron Apr 5 03:00:01 server01 CROND[12345]: (root) CMD (/usr/local/bin/backup.sh) Apr 5 03:00:01 server01 CROND[12346]: (root) CMD (/usr/lib64/sa/sa1 1 1)

5. ローテーション済みの圧縮ファイルも含めて検索する

logrotate で圧縮(.gz)されたファイルも含めて一括検索するには、zgrep を使います。

# 圧縮済みを含む全ローテーションファイルをgrep # zgrep "backup.sh" /var/log/cron* # 非圧縮ファイルのみまとめて検索する場合(gzを除く場合) # grep "backup.sh" /var/log/cron /var/log/cron-2026*

環境によってはローテーション後に .gz 圧縮される設定になっています。その場合は通常の grep では読めないため、zgrep(または zcat ファイル | grep)を使います。

journalctlでcronログを確認する(systemd環境)

Ubuntu 24.04やRHEL 9などのsystemd環境では、rsyslogによる /var/log/cron への出力に加えて、journalctl でもcronログを確認できます。

Ubuntuではデフォルトで /var/log/cron が存在しないため、journalctl が主要な確認手段です。

1. cronデーモンのログを表示する

# RHEL系(crond) # journalctl -u crond # Ubuntu系(cron) # journalctl -u cron # 直近20行だけ確認する(--no-pager でページャーを無効化) # journalctl -u crond -n 20 --no-pager

ページャーが邪魔な場合は --no-pager を付けると出力がそのままターミナルに流れます。スクリプト内での利用や、出力をパイプで加工したいときに便利です。

2. 今日のログだけを表示する

# journalctl -u crond --since today Apr 05 00:00:01 server01 CROND[1234]: (root) CMD (/usr/lib64/sa/sa1 1 1) Apr 05 01:00:01 server01 CROND[1456]: (root) CMD (run-parts /etc/cron.hourly) Apr 05 03:00:01 server01 CROND[1789]: (root) CMD (/usr/local/bin/backup.sh)

3. 時間範囲を指定して表示する

# 時刻を指定して絞り込む # journalctl -u crond --since "2026-04-04 22:00" --until "2026-04-05 06:00" # 「1時間前から現在まで」のように相対指定も使える # journalctl -u crond --since "1 hour ago"

障害調査では時間範囲を絞って確認するのが基本です。深夜バッチの確認などで重宝します。相対指定(--since "2 hours ago" など)は手軽で日常的な確認に向いています。

4. エラーだけを絞り込む(-p err)

-p err(priority)オプションを付けると、エラー以上の深刻なメッセージだけに絞り込めます。ログが大量にある場合も、原因特定が一気に速くなります。

# エラー以上のメッセージだけ表示する # journalctl -u crond -p err # 時間帯とエラーフィルターを組み合わせる # journalctl -u crond -p err --since "2026-04-05 00:00" --no-pager

5. リアルタイム監視する

# journalctl -u crond -f

tail -f と同じ感覚で使えます。

logrotateとcronログの世代管理

/var/log/cron は logrotate によって定期的にローテーション(世代交代)されます。過去のログを確認したい場合は、ローテーションされたファイルを参照する必要があります。

# ls -la /var/log/cron* -rw-------. 1 root root 84523 Apr 5 12:01 /var/log/cron -rw-------. 1 root root 156234 Apr 4 03:22 /var/log/cron-20260404 -rw-------. 1 root root 148901 Mar 28 03:22 /var/log/cron-20260328 -rw-------. 1 root root 142567 Mar 21 03:22 /var/log/cron-20260321 -rw-------. 1 root root 139045 Mar 14 03:22 /var/log/cron-20260314

RHEL系ではデフォルトで4世代分が保持されます。logrotateの設定は /etc/logrotate.d/syslog で確認できます。

過去のログをgrepで一括検索する場合は、ワイルドカードを使います。

# grep "backup.sh" /var/log/cron* /var/log/cron:Apr 5 03:00:01 server01 CROND[12345]: (root) CMD (/usr/local/bin/backup.sh) /var/log/cron-20260404:Apr 4 03:00:01 server01 CROND[11234]: (root) CMD (/usr/local/bin/backup.sh) /var/log/cron-20260328:Mar 28 03:00:01 server01 CROND[10123]: (root) CMD (/usr/local/bin/backup.sh)

環境によってはローテーション後に .gz 形式で圧縮される場合があります。その場合は通常の grep では読めないため zgrep を使ってください。

ローテーションの世代数を変更したい場合は、logrotateの設定ファイルで rotate の値を変更してください。

cronのログが出力されないときのトラブルシュート

「/var/log/cron が存在しない」「ログが記録されていない」というケースは、実務でも意外と遭遇します。主な原因と対処法を確認しましょう。

1. rsyslogでcronログが無効になっている

RHEL系では、rsyslogの設定でcronログの出力先が定義されています。

# grep cron /etc/rsyslog.conf cron.* /var/log/cron

この行がコメントアウトされていると、/var/log/cron にログが出力されません。コメントを外してrsyslogを再起動してください。

# systemctl restart rsyslog

2. cronデーモンが停止している

そもそもcronデーモン(crond)が動作していなければ、ジョブもログも出力されません。

# systemctl status crond * crond.service - Command Scheduler Loaded: loaded (/usr/lib/systemd/system/crond.service; enabled) Active: active (running) since Sat 2026-04-05 00:00:01 JST

「Active: inactive」や「Active: failed」と表示される場合は、cronデーモンが停止しています。以下のコマンドで起動してください。

# systemctl start crond # systemctl enable crond

3. /var/log/cron のパーミッションが不正

/var/log/cron は通常、root ユーザーのみが読み取れるパーミッション(600)になっています。一般ユーザーで確認しようとすると「Permission denied」になります。

$ cat /var/log/cron cat: /var/log/cron: Permission denied # sudo を使って確認する $ sudo tail /var/log/cron

4. Ubuntuで /var/log/cron が存在しない

Ubuntuではデフォルトで /var/log/cron ファイルが作成されません。cronのログを確認するには、前述の journalctl -u cron を使うか、grep CRON /var/log/syslog で抽出するのが手軽です。rsyslogの設定を追加すれば専用ファイルに分離することもできます。

# Ubuntu でcronログだけ抽出する(/var/log/syslogから) # grep CRON /var/log/syslog # /etc/rsyslog.d/50-default.conf に以下を追加して専用ファイルに分離する場合 cron.* /var/log/cron.log # rsyslogを再起動 # systemctl restart rsyslog

本記事のまとめ

cronのログ確認方法を一覧にまとめます。
やりたいこと コマンド
最新のcronログを確認 tail /var/log/cron
直近N行を確認する tail -n 50 /var/log/cron
cronログをリアルタイム監視 tail -f /var/log/cron
特定のジョブで絞り込む grep "スクリプト名" /var/log/cron
特定ユーザーのジョブを確認 grep "(ユーザー名)" /var/log/cron
crontab編集履歴を確認 grep "REPLACE" /var/log/cron
圧縮ローテーションログも含めて検索 zgrep "スクリプト名" /var/log/cron*
systemd環境でcronログを確認 journalctl -u crond
今日のcronログだけ表示 journalctl -u crond --since today
直近1時間のログを確認 journalctl -u crond --since "1 hour ago"
cronのエラーだけ絞り込む journalctl -u crond -p err
過去のローテーション済みログを検索 grep "スクリプト名" /var/log/cron*
rsyslogのcron設定を確認 grep cron /etc/rsyslog.conf
cronデーモンの状態を確認 systemctl status crond

よくある質問(FAQ)

Ubuntu/Debian で /var/log/cron がありません。どこを見ればいいですか?

Ubuntu/Debian系では cron専用ログファイルは作られず、/var/log/syslog に他のサービスログと一緒に出力されます。grep CRON /var/log/syslog で抽出するか、systemd環境なら journalctl -u cron(サービス名は cron、CentOS系の crond と違うので注意)で確認します。

crontab を編集した履歴を確認できますか?

crontab 自体には編集履歴を残す機能はありませんが、/var/log/cron に (USERNAME) REPLACE (USERNAME) という行が記録されるため、いつ誰が crontab を更新したかは時刻ベースで追えます。/var/spool/cron/USERNAME ファイルのタイムスタンプ(ls -l /var/spool/cron/)も最終編集時刻として参考になります。本格的に変更履歴を管理するなら crontab を git 配下に置き、適用前に diff を取る運用が確実です。

cron でスクリプトが実行されているのに標準出力が見えません。なぜですか?

cron は標準出力・標準エラーをデフォルトでユーザー宛のローカルメールに送ります。/var/spool/mail/USERNAME を確認してください。実務ではメールで埋もれるため、crontab に * * * * * /path/to/script.sh >> /var/log/myscript.log 2>&1 のようにファイル出力をリダイレクトする方が運用しやすいです。

journalctl で cron のログだけを絞り込む方法は?

CentOS/RHEL系は journalctl -u crond、Ubuntu/Debian系は journalctl -u cron です。直近20件だけ見るなら -n 20 --no-pager、リアルタイム追跡なら -f、過去1時間に絞るなら --since "1 hour ago"、エラーだけ見るなら -p err を組み合わせます。

「cronが動かない」と夜中に焦った経験はありませんか?

cronの設定ミスは、ログの読み方を知らなければ原因の特定すらできません。しかし、ログの見方はLinuxサーバー管理の基本中の基本です。
現場で通用する安全なLinuxサーバー構築の「型」を体系的に身につけたい方へ、『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼントしています。

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

<PR>手元に置いて学びを深める1冊

ITエンジニア1年生のための まんがでわかるLinux コマンド&シェルスクリプト基礎編

まず無料メルマガで基礎を固めながら、cronやシェルスクリプトを体系的に学ぶなら本書を手元に。マンガ形式で読みやすく、コマンドライン操作の全体像が一冊でつかめます。

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

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

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

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

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

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

姓・名・メールの3つだけ/30秒/解除は3秒 / 詳細はこちら

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

この記事を書いた人

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

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

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