構文
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回実行
@yearly0 0 1 1 * — 年1回(1月1日)
@monthly0 0 1 * * — 月1回(1日)
@weekly0 0 * * 0 — 週1回(日曜日)
@daily0 0 * * * — 日1回(深夜0時)
@hourly0 * * * * — 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出力をこのアドレスにメール(空で無効)
HOMEcron ジョブのホームディレクトリ
ログ
出力 & ログ
# 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