CRON クイックリファレンス
ジョブスケジューリング、crontab 構文、特殊文字列、ログ
構文
Crontab の形式
# ┌───── minute (0-59)
# │ ┌───── hour (0-23)
# │ │ ┌───── day of month (1-31)
# │ │ │ ┌───── month (1-12)
# │ │ │ │ ┌───── day of week (0-7, 0&7=Sun)
# * * * * * command
フィールドの値
| * | 任意の値(ワイルドカード) |
| , | 値のリスト: 1,3,5 |
| - | 範囲: 1-5 |
| / | ステップ: */10(10ごと) |
| 0-59 | 分の範囲 |
| 0-23 | 時の範囲 |
| 1-31 | 日の範囲 |
| 1-12 | 月の範囲(または JAN-DEC) |
| 0-7 | 曜日(0&7=日曜、または SUN-SAT) |
特殊文字列
スケジールの略記
| @reboot | 起動時に1回実行 |
| @yearly | 0 0 1 1 * — 年1回(1月1日) |
| @monthly | 0 0 1 * * — 月1回(1日) |
| @weekly | 0 0 * * 0 — 週1回(日曜日) |
| @daily | 0 0 * * * — 日1回(深夜0時) |
| @hourly | 0 * * * * — 1時間に1回 |
例
よく使うスケジュール
30 2 * * * /usr/local/bin/backup.sh
0 9 * * 1-5 /opt/report.sh
*/15 * * * * /usr/bin/health-check.sh
0 0 1 * * /opt/monthly-cleanup.sh
0 8,17 * * * /opt/notify.sh
スケジュールの解説
| 30 2 * * * | 毎日 2:30 AM |
| 0 9 * * 1-5 | 平日 9:00 AM |
| */15 * * * * | 15分ごと |
| 0 0 1 * * | 毎月1日の深夜0時 |
| 0 8,17 * * * | 毎日 8 AM と 5 PM |
環境変数
変数の設定
SHELL=/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin
[email protected]
HOME=/home/deploy
* * * * * /opt/myjob.sh
環境変数のメモ
| SHELL | コマンドを実行するシェル(デフォルト: /bin/sh) |
| PATH | 検索パス(cron のデフォルトは最小限) |
| MAILTO | 出力をこのアドレスにメール(空で無効) |
| HOME | cron ジョブのホームディレクトリ |
ログ
出力 & ログ
# redirect stdout + stderr to a log file
*/5 * * * * /opt/job.sh >> /var/log/job.log 2>&1
# discard all output
0 3 * * * /opt/job.sh > /dev/null 2>&1
# log only errors
0 3 * * * /opt/job.sh > /dev/null 2>> /var/log/job-err.log
Cron ログの確認
# Debian / Ubuntu (syslog)
grep CRON /var/log/syslog
# RHEL / CentOS
cat /var/log/cron
# journalctl (systemd)
journalctl -u cron --since "1 hour ago"
よく使うスケジュール
日常的なパターン
| 0 * * * * | 毎時0分 |
| */5 * * * * | 5分ごと |
| */30 * * * * | 30分ごと |
| 0 0 * * * | 毎日深夜0時 |
| 0 6 * * 1 | 毎週月曜 6 AM |
| 0 0 1,15 * * | 毎月1日と15日 |
| 0 0 * * 5 | 毎週金曜の深夜0時 |
| 0 0 1 1 * | 毎年1月1日 |
crontab コマンド
crontab の管理
crontab -e # edit your crontab
crontab -l # list your crontab
crontab -r # remove your crontab
crontab -u alice -l # list another user's (root)
crontab /path/to/file # install crontab from file
システム crontab の場所
| /etc/crontab | システム全体の crontab(ユーザーフィールドあり) |
| /etc/cron.d/ | ドロップイン cron ファイル |
| /etc/cron.daily/ | 毎日実行されるスクリプト |
| /etc/cron.hourly/ | 毎時実行されるスクリプト |
| /etc/cron.weekly/ | 毎週実行されるスクリプト |
| /etc/cron.monthly/ | 毎月実行されるスクリプト |
| /var/spool/cron/ | ユーザーごとの crontab の保存場所 |
ヒント
ベストプラクティス
| 絶対パスを使う | cron の PATH は最小限。常にフルパスを使用 |
| 出力をリダイレクト | > /dev/null 2>&1 でメール大量送信を回避 |
| ロックファイル | flock で二重起動を防止 |
| 事前テスト | スケジューリング前に手動でコマンドをテスト |
| MAILTO を使う | MAILTO="" で全メールを抑制 |
| タイムゾーンを確認 | cron はシステム時刻を使用。date で確認 |
flock による二重起動防止
# only run if not already running
* * * * * /usr/bin/flock -n /tmp/job.lock /opt/job.sh