cron式の書き方 完全ガイド - 5フィールドの読み方と実例
サーバーで定期実行を組むときに必ず出てくる「cron式」。0 3 * * * のような記号の羅列は最初こそ難解に見えますが、ルールは5つの欄を順番に読むだけです。本記事を読めば、よくあるスケジュールは自分で書けるようになります。
書いた式が正しいか不安なときは cron式ビルダー で次回実行時刻を確認しながら読むのがおすすめです。
1. cron式は「5つのフィールド」でできている
標準的なcron(Linuxのcrontab)は、半角スペースで区切られた5つの欄で1つのスケジュールを表します。
┌───── 分 (0-59) │ ┌─── 時 (0-23) │ │ ┌─ 日 (1-31) │ │ │ ┌ 月 (1-12) │ │ │ │ ┌ 曜日 (0-7, 0と7は日曜) │ │ │ │ │ * * * * * 実行するコマンド
| 位置 | フィールド | 範囲 |
|---|---|---|
| 1 | 分 | 0–59 |
| 2 | 時 | 0–23 |
| 3 | 日 | 1–31 |
| 4 | 月 | 1–12 |
| 5 | 曜日 | 0–7(0と7=日曜、1=月曜 … 6=土曜) |
2. 4つの記号を覚えれば十分
| 記号 | 意味 | 例 |
|---|---|---|
* | すべての値(毎回) | 分の欄が * → 毎分 |
, | 複数指定 | 0,30 → 0分と30分 |
- | 範囲 | 1-5 → 月〜金 |
/ | 間隔(〜ごと) | */15 → 15分ごと |
3. よく使うスケジュール例
| cron式 | 意味 |
|---|---|
* * * * * | 毎分 |
*/5 * * * * | 5分ごと |
0 * * * * | 毎時0分(1時間ごと) |
0 3 * * * | 毎日 午前3時 |
30 9 * * 1-5 | 平日(月〜金)9時30分 |
0 0 * * 0 | 毎週日曜の0時 |
0 0 1 * * | 毎月1日の0時 |
0 0 1 1 * | 毎年1月1日の0時 |
15 14 1 * * | 毎月1日 14時15分 |
0 22 * * 1-5 | 平日 22時 |
4. 「日」と「曜日」を両方指定したときの落とし穴
要注意:多くのcron実装では、「日」と「曜日」の両方を指定すると、どちらか一方が一致した日に実行されます(AND ではなく OR)。
例えば 0 0 1 * 1 は「毎月1日」かつ「毎週月曜」ではなく、「毎月1日」または「毎週月曜」に実行されます。「毎月第1月曜だけ」のような条件は単純なcron式では表現できないため、スクリプト側で日付を判定する必要があります。
5. 環境による違いに注意
- タイムゾーン:cronは通常サーバーのローカル時刻で動きます。UTC運用のサーバーでは日本時間とずれるため、
CRON_TZ=Asia/Tokyoの指定やUTC換算が必要です。 - 秒フィールド:標準のcronに秒はありません。Quartz(Java)やNode.jsの一部ライブラリは6フィールド(先頭に秒)を使うので、貼り付ける場所に合わせて確認しましょう。
- 特殊文字列:実装によっては
@daily、@hourly、@rebootといったショートカットも使えます。
| 特殊文字列 | 同等のcron式 |
|---|---|
@hourly | 0 * * * * |
@daily / @midnight | 0 0 * * * |
@weekly | 0 0 * * 0 |
@monthly | 0 0 1 * * |
@yearly / @annually | 0 0 1 1 * |
6. crontabの基本操作
crontab -e # 編集 crontab -l # 一覧表示 crontab -r # 全削除(取り扱い注意)
1行に1スケジュールを書きます。実行コマンドの絶対パス指定と、ログ出力のリダイレクトを付けておくとトラブル時に追いやすくなります。
0 3 * * * /usr/bin/python3 /opt/app/backup.py >> /var/log/backup.log 2>&1
7. ハマったときの確認手順
- 式が意図どおりか cron式ビルダー で次回実行時刻を確認する。
- サーバーのタイムゾーン(
timedatectlやdate)を確認する。 - cronの実行ログ(
/var/log/syslogやjournalctl -u cron)を見る。 - 環境変数(PATHなど)はcron実行時に最小限になる点に注意。コマンドは絶対パスで書く。
8. まとめ
- cron式は「分・時・日・月・曜日」の5フィールドを順に読むだけ。
- 記号は
*(毎回)・,(複数)・-(範囲)・/(間隔)の4つを押さえればOK。 - 「日」と「曜日」の同時指定はOR動作になる点に注意。
- タイムゾーン・秒フィールドの有無は環境で異なる。
実際に式を組み立てて次回実行時刻を確かめるなら cron式ビルダー をどうぞ。