導入
0 3 * * * という並びは、慣れれば一目で「毎日3時」と読めます。逆に読めないと、他人が仕込んだ設定に触れません。ここは暗記ではなく、構造を理解すれば読めるようになります。
説明
5つのフィールドは、左から小さい単位 → 大きい単位の順です。
┌────── 分 (0-59)
│ ┌──── 時 (0-23)
│ │ ┌── 日 (1-31)
│ │ │ ┌ 月 (1-12)
│ │ │ │ ┌ 曜日 (0-7、0と7が日曜)
│ │ │ │ │
0 3 * * * /home/user/scripts/backup.sh
* は「すべて」。つまり 0 3 * * * は「毎日・毎月・どの曜日でも、3時0分に」という意味になります。
各フィールドには4つの書き方があります。
| 書き方 | 例 | 意味 |
|---|---|---|
| 数値 | 30 | ちょうどその値 |
* | * | すべて |
*/n | */15 | n おき(0,15,30,45 分) |
a-b | 9-18 | 範囲(9時〜18時) |
a,b,c | 1,15 | 列挙(1日と15日) |
よく使う例を読んでみましょう。
| 設定 | 意味 |
|---|---|
*/5 * * * * | 5分おき |
0 * * * * | 毎時0分(1時間おき) |
0 3 * * * | 毎日3時 |
30 9 * * 1-5 | 平日(月〜金)の9時30分 |
0 0 1 * * | 毎月1日の0時 |
0 9 * * 1 | 毎週月曜の9時 |
「日」と「曜日」の両方を指定すると OR になる(どちらかに当てはまれば実行)という独特のルールがあるので、片方は * にしておくのが無難です。
読み書きしやすくする書き方として、@daily(毎日0時)・@hourly(毎時0分)・@weekly・@monthly・@reboot(起動時)という特殊指定もあります。
#!/bin/bash
# 予定表を見ながら、5つのフィールドを読み解く
crontab -l
echo "---"
echo "0 3 * * * → 毎日 3時0分"
echo "*/15 * * * * → 15分おき"
echo "30 9 * * 1-5 → 平日の 9時30分"
echo "@daily → 毎日 0時(0 0 * * * と同じ)"
やってみよう
下の端末で crontab -l を見ながら、0 3 * * * と */15 * * * * がそれぞれ何を意味するか、上の表と照らし合わせてください。そのうえで cronsim 03:00 と打つと、3時になったことにして予定が実行されます。cronsim 03:15、cronsim 04:00 も試して、どの予定が動くかを確かめましょう。
演習
cronsim 03:00 を実行して、0 3 * * * に登録されたバックアップが動くことを確かめてください。
ヒント1を見る
cronsim 時:分 で、その時刻になったことにできます。
ヒント2を見る
下の端末で cronsim 03:00