Linuxのcronは、指定した日時・間隔でコマンドやスクリプトを自動実行するデーモンです。crontabはそのスケジュール設定ファイルのことで、crontabコマンドで管理します。バックアップ・ログローテーション・定期レポート送信など、日常的な運用自動化に欠かせないツールです。
cron とは
cronはLinux/Unix系OSで標準的に利用されるジョブスケジューラです。システム起動時にバックグラウンドで起動し(デーモンとして常駐)、設定ファイル(crontab)に書かれたスケジュールに従ってコマンドを実行します。
- cron:バックグラウンドで動き続けるデーモンプロセス(
crondまたはcron) - crontab:スケジュール定義ファイル。ユーザーごとに独立して設定可能
- crontab コマンド:crontabファイルを操作するコマンド(編集・一覧・削除など)
crontab コマンドの基本操作
crontabの操作は主に3つのオプションを使います。
| コマンド | 説明 |
|---|---|
crontab -e | crontabを編集する(エディタが開く) |
crontab -l | crontabの内容を一覧表示する |
crontab -r | crontabを削除する(全削除されるため注意) |
crontab -u ユーザー名 -l | 他のユーザーのcrontabを表示(root権限が必要) |
crontab -e:編集
crontab -e
EDITORまたはVISUAL環境変数に設定されたエディタが起動します。未設定の場合はnanoやviが使われます。保存して閉じると設定が即座に反映されます。
crontab -l:一覧表示
crontab -l
現在のユーザーのcrontab内容を標準出力に表示します。cronジョブが設定されていない場合は no crontab for ユーザー名 と表示されます。
# 実行例
$ crontab -l
0 2 * * * /home/user/backup.sh
*/5 * * * * /usr/local/bin/check_disk.sh
crontab の書式
crontabの各行は次の形式で記述します。
分 時 日 月 曜日 実行コマンド
| フィールド | 範囲 | 説明 |
|---|---|---|
| 分(minute) | 0〜59 | 実行する分 |
| 時(hour) | 0〜23 | 実行する時 |
| 日(day of month) | 1〜31 | 実行する日 |
| 月(month) | 1〜12 | 実行する月 |
| 曜日(day of week) | 0〜7(0と7が日曜日) | 実行する曜日 |
各フィールドには次の記法が使えます。
*:すべての値に一致(毎分・毎時など)*/n:n間隔ごと(*/5なら5分ごと)a-b:aからbの範囲(1-5なら月〜金)a,b,c:複数の値を列挙(1,15なら1日と15日)
よく使うスケジュール設定例
# 毎日午前2時にバックアップを実行
0 2 * * * /home/user/backup.sh
# 5分ごとにディスク使用量をチェック
*/5 * * * * /usr/local/bin/check_disk.sh
# 毎週月曜日の朝9時にレポートを送信
0 9 * * 1 /home/user/weekly_report.sh
# 毎月1日の深夜0時にログをアーカイブ
0 0 1 * * /usr/local/bin/archive_logs.sh
# 平日(月〜金)の毎正時にジョブを実行
0 * * * 1-5 /home/user/workday_job.sh
# 毎日午前0時と正午の2回実行
0 0,12 * * * /home/user/twice_daily.sh
# 毎時15分・45分に実行
15,45 * * * * /home/user/check.sh
# 1時間ごとに実行(毎時0分)
0 * * * * /home/user/hourly.sh
# 毎分実行(テスト・監視用)
* * * * * /home/user/monitor.sh
特殊文字列(@マクロ)
よく使うスケジュールは @ から始まる特殊文字列で簡潔に書けます。
| 記法 | 意味 |
|---|---|
@reboot | システム起動時に1回だけ実行 |
@yearly(@annually) | 年に1回(0 0 1 1 * と同じ) |
@monthly | 月に1回(0 0 1 * * と同じ) |
@weekly | 週に1回(0 0 * * 0 と同じ) |
@daily(@midnight) | 毎日1回(0 0 * * * と同じ) |
@hourly | 毎時1回(0 * * * * と同じ) |
# 起動時に自動実行
@reboot /home/user/start_service.sh
# 毎日深夜に実行
@daily /home/user/daily_cleanup.sh
環境変数の設定
cronの実行環境は通常のシェルと異なり、PATHなどの環境変数が最小限しか設定されていません。crontabファイル内で環境変数を定義できます。
# crontabの先頭で環境変数を定義
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/home/user/bin
MAILTO=admin@example.com
# コマンドの出力は MAILTO で指定したアドレスにメール送信される
0 2 * * * /home/user/backup.sh
# メール送信を無効にする(出力を破棄)
0 * * * * /home/user/job.sh > /dev/null 2>&1
MAILTO=""を設定するとメール送信を無効化できます。コマンドの出力ログを残したい場合は> /var/log/myjob.log 2>&1のようにファイルにリダイレクトしましょう。
実行ログの確認方法
cronが実際に動作したかどうかはシステムログで確認できます。
systemd(journald)環境
# cronのログをリアルタイムで表示
journalctl -u cron -f
# 直近のcronログを確認
journalctl -u cron --since "1 hour ago"
# cronジョブの実行履歴(全件)
journalctl -u cron
syslog環境(/var/log/syslog)
# syslogからcronのログを抽出
grep CRON /var/log/syslog
# リアルタイムで確認
tail -f /var/log/syslog | grep CRON
# cronログ専用ファイルが存在する場合
tail -f /var/log/cron
ログには CMD (/home/user/backup.sh) のようにコマンド実行の記録が残ります。ここに記録されていない場合はcron自体が動作していない可能性があります。
cron が実行されない時の確認項目
crontabに設定したのにコマンドが実行されない場合は、以下の順番で確認します。
1. cron デーモンが起動しているか確認
# systemdの場合
systemctl status cron # Debian/Ubuntu
systemctl status crond # RHEL/CentOS
# 起動していない場合
sudo systemctl start cron
sudo systemctl enable cron # 自動起動を有効化
2. crontab の書式エラーを確認
# 現在のcrontabを表示して確認
crontab -l
# よくある書式ミス例
# NG: 分・時フィールドの範囲外(60分や25時など)
# NG: フィールドが5つ未満または多すぎる
# NG: コマンドパスのタイポ
3. スクリプトに実行権限があるか確認
# 実行権限を確認
ls -la /home/user/backup.sh
# 実行権限がない場合は付与
chmod +x /home/user/backup.sh
4. コマンドのパスを絶対パスで指定しているか確認
cronのPATHは通常のシェルより短く、/usr/local/binなどが含まれない場合があります。コマンドは絶対パスで指定するのが安全です。
# NG: 相対パスやエイリアス
0 2 * * * backup.sh
0 2 * * * python script.py
# OK: 絶対パスで指定
0 2 * * * /home/user/backup.sh
0 2 * * * /usr/bin/python3 /home/user/script.py
5. スクリプトのエラーをログに出力して確認
# 標準出力と標準エラーをログファイルに記録
0 2 * * * /home/user/backup.sh >> /var/log/backup.log 2>&1
# ログを確認してエラーがないか調べる
tail -f /var/log/backup.log
6. ユーザーの cron 実行が許可されているか確認
# /etc/cron.allow が存在する場合、このファイルにユーザー名がある必要がある
cat /etc/cron.allow
# /etc/cron.deny が存在する場合、このファイルにユーザー名があると実行できない
cat /etc/cron.deny
7. スクリプト単体での動作確認
# cron と同じ最小限の環境変数でスクリプトをテスト実行
env -i HOME=/root SHELL=/bin/bash PATH=/usr/local/bin:/usr/bin:/bin /home/user/backup.sh
システム全体の cron 設定ファイル
ユーザーごとの crontab -e 以外に、システム全体の定期実行ファイルが存在します。
| 場所 | 説明 |
|---|---|
/etc/crontab | システム全体のcrontab(ユーザー名フィールドが追加される) |
/etc/cron.d/ | パッケージが追加するcron設定ファイルを置くディレクトリ |
/etc/cron.hourly/ | 1時間ごとに実行されるスクリプト置き場 |
/etc/cron.daily/ | 毎日実行されるスクリプト置き場 |
/etc/cron.weekly/ | 毎週実行されるスクリプト置き場 |
/etc/cron.monthly/ | 毎月実行されるスクリプト置き場 |
# /etc/crontab の書式(ユーザー名フィールドが追加される)
# 分 時 日 月 曜日 ユーザー コマンド
0 2 * * * root /usr/local/bin/backup.sh
# /etc/cron.daily/ にスクリプトを置くだけで毎日実行される
sudo cp myjob.sh /etc/cron.daily/
sudo chmod +x /etc/cron.daily/myjob.sh
まとめ
cronとcrontabの基本操作をまとめます。
crontab -e:スケジュールを編集するcrontab -l:現在の設定を確認する- 書式は
分 時 日 月 曜日 コマンドの順で記述する - コマンドは絶対パスで指定し、実行権限を付与しておく
- 実行されない場合は
journalctl -u cronまたはgrep CRON /var/log/syslogでログを確認する @reboot・@daily・@weeklyなどの特殊記法を使うと記述が簡潔になる

コメント