毎日深夜にログを整理したり、毎時バックアップを取ったり――こういった 定期的な作業を自動化 するのが cron(クーロン) です。
crontab コマンドを使ってスケジュールを登録するだけで、あとは Linux が自動で実行してくれます。
cron の仕組み
cron は OS が常時起動しているデーモン(crond または cron)です。
ユーザーが crontab にジョブを登録しておくと、指定した時刻になると自動でコマンドを実行します。
[スケジュール定義] → [crond が監視] → [時刻一致] → [コマンド実行]
crontab の書式
crontab の各行は次の形式で書きます。
分 時 日 月 曜日 コマンド
| フィールド | 範囲 |
|---|---|
| 分 | 0–59 |
| 時 | 0–23 |
| 日 | 1–31 |
| 月 | 1–12 |
| 曜日 | 0–7(0 と 7 が日曜日) |
特殊な記号も使えます。
| 記号 | 意味 | 例 |
|---|---|---|
* | 毎回(全ての値) | * → 毎分 |
, | 複数指定 | 1,15 → 1 日と 15 日 |
- | 範囲指定 | 9-17 → 9 時から 17 時 |
/ | ステップ指定 | */10 → 10 ごと |
書式の読み方:例
# 毎日 0 時 0 分に実行
0 0 * * * /home/user/backup.sh
# 毎週月曜日 8 時 30 分に実行
30 8 * * 1 /home/user/report.sh
# 10 分おきに実行
*/10 * * * * /home/user/check.sh
# 平日(月〜金)の 9 時から 18 時まで、1 時間ごとに実行
0 9-18 * * 1-5 /home/user/hourly.sh
crontab を操作するコマンド
自分の crontab を編集する
crontab -e
エディタ(通常は vi または nano)が開くので、1 行 1 ジョブの形式で記述します。
保存して閉じると、自動的に登録されます。
登録されているジョブを確認する
crontab -l
*/30 * * * * /home/user/scripts/cleanup.sh
0 2 * * * /home/user/scripts/backup.sh
全ての crontab を削除する
crontab -r
注意:
-rは全ジョブを削除します。元に戻せないので慎重に実行してください。
実際にジョブを登録してみる
ステップ 1: スクリプトを準備する
まず実行させたいスクリプトを用意します。 ここでは動作確認用に、実行時刻をログファイルに記録するスクリプトを作ります。
mkdir -p ~/scripts
cat > ~/scripts/log_time.sh << 'EOF'
#!/bin/bash
echo "実行時刻: $(date '+%Y-%m-%d %H:%M:%S')" >> ~/cron_test.log
EOF
chmod +x ~/scripts/log_time.sh
スクリプトの動作を確認しておきます。
~/scripts/log_time.sh
cat ~/cron_test.log
実行時刻: 2026-07-01 14:35:00
ステップ 2: crontab に登録する
crontab -e を実行してエディタを開き、以下の行を追記します。
# 毎分、時刻をログファイルに記録する(テスト用)
* * * * * /home/user/scripts/log_time.sh
保存して閉じます。
ステップ 3: 登録を確認する
crontab -l
# 毎分、時刻をログファイルに記録する(テスト用)
* * * * * /home/user/scripts/log_time.sh
数分待ってからログを確認します。
cat ~/cron_test.log
実行時刻: 2026-07-01 14:36:00
実行時刻: 2026-07-01 14:37:00
実行時刻: 2026-07-01 14:38:00
cron が毎分スクリプトを実行していることが確認できました。
ステップ 4: テスト用ジョブを削除する
動作確認が済んだら、テスト用ジョブを削除します。
crontab -e でエディタを開き、追記した行を削除して保存します。
よく使うパターン集
# 毎日午前 3 時にバックアップ
0 3 * * * /home/user/scripts/backup.sh
# 毎週日曜日 23 時に古いログを削除
0 23 * * 0 find /var/log/myapp -name "*.log" -mtime +30 -delete
# 毎月 1 日の午前 0 時に月次レポートを生成
0 0 1 * * /home/user/scripts/monthly_report.sh
# 平日の朝 9 時から 17 時まで 15 分おきに死活監視
*/15 9-17 * * 1-5 /home/user/scripts/health_check.sh
cron ジョブのデバッグ
cron は通常、コマンドの標準出力を捨てます。ジョブが動いているか確認するには、 出力をファイルにリダイレクト するのが手軽です。
# 標準出力とエラー出力をともにログに保存する
0 3 * * * /home/user/scripts/backup.sh >> /home/user/cron.log 2>&1
2>&1 は標準エラー出力(stderr)を標準出力(stdout)に合流させる記法です。
よくあるミスと対策
| ミス | 原因と対策 |
|---|---|
| ジョブが動かない | スクリプトに実行権限がない → chmod +x で付与する |
| コマンドが見つからない | cron は PATH が限られる → フルパスで書く(例: /usr/bin/python3) |
| 環境変数が使えない | cron のシェルは .bashrc を読まない → スクリプト内で明示的に設定する |
| 意図しない時刻に実行 | サーバのタイムゾーンを確認 → timedatectl で確認する |
練習問題
問題 1
毎日 23 時 59 分に /tmp/daily_cleanup.sh を実行する crontab エントリを書いてください。
解答を見る
59 23 * * * /tmp/daily_cleanup.sh問題 2
以下の crontab エントリはいつ実行されますか?
0 */6 * * 1-5
解答を見る
平日(月〜金)の 0 時・6 時・12 時・18 時 に実行されます。
0… 0 分(毎時ちょうど)*/6… 6 時間ごと(0, 6, 12, 18 時)*… 毎日*… 毎月1-5… 月曜〜金曜
問題 3
実行時刻とホスト名を ~/system_check.log に追記するスクリプト system_check.sh を作り、
5 分おきに実行する crontab エントリを登録してください。
ログには cron 経由でも確実に出力されるよう、コマンドはフルパスで書いてください。
解答を見る
スクリプト ~/scripts/system_check.sh:
#!/bin/bash
LOG="$HOME/system_check.log"
echo "[$(/bin/date '+%Y-%m-%d %H:%M:%S')] host=$(/bin/hostname)" >> "$LOG"実行権限を付与:
chmod +x ~/scripts/system_check.shcrontab エントリ(crontab -e で追記):
*/5 * * * * /home/user/scripts/system_check.shログの確認:
tail -f ~/system_check.log