システム管理 初級

cronジョブ入門

crontab を使ってコマンドやスクリプトを定期実行する方法を学ぶ。書式の読み方から実際のジョブ登録・確認・削除まで丁寧に解説する

毎日深夜にログを整理したり、毎時バックアップを取ったり――こういった 定期的な作業を自動化 するのが 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.sh

crontab エントリ(crontab -e で追記):

*/5 * * * * /home/user/scripts/system_check.sh

ログの確認:

tail -f ~/system_check.log