標準的なCron式は5つのフィールドで構成されます。左から「分・時・日・月・曜日」の順で、スペースで区切ります。
cron# 5フィールド形式(標準Unix/Linux crontab)
┌───────────── 分 (0-59)
│ ┌───────────── 時 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 曜日 (0-7, 0と7は日曜)
│ │ │ │ │
* * * * *
各フィールドの値の範囲
| フィールド | 値の範囲 | 補足 |
|---|
| 分 | 0-59 | |
| 時 | 0-23 | 0は深夜0時 |
| 日 | 1-31 | |
| 月 | 1-12 | JAN-DECも使用可(一部環境) |
| 曜日 | 0-7 | 0と7は日曜(多くのLinux環境)、MON-SUNも使用可(一部環境) |
特殊文字
Cron式のフィールドには、数値のほかに特殊文字を使って柔軟なスケジュールを指定できます。
標準特殊文字(すべての環境で使用可能)
| 文字 | 名前 | 説明 | 例 |
|---|
* | ワイルドカード | すべての値にマッチ | * * * * * = 毎分実行 |
/ | ステップ | 間隔を指定 | */15 * * * * = 15分ごと |
- | 範囲 | 連続する範囲を指定 | 0 9-17 * * * = 9時から17時の毎正時 |
, | リスト | 複数の値を列挙 | 0 0,12 * * * = 0時と12時 |
cron# 特殊文字の組み合わせ例
*/5 * * * * # 5分ごとに実行
0 9-17 * * * # 9時〜17時の毎正時
0 9 * * 1-5 # 平日(月〜金)の午前9時
0 0,12 * * * # 0時と12時に実行
0 */2 * * * # 2時間ごと(0, 2, 4, ... 22時)
*/10 9-17 * * 1-5 # 平日9〜17時の10分ごと
拡張特殊文字(Quartz Scheduler / AWS等の一部環境専用)
| 文字 | 名前 | 説明 | 例 |
|---|
? | 無指定 | 日または曜日で「未指定」を表す | 0 9 ? * MON = 毎週月曜9時 |
L | 最終 | 月の最終日、または最終曜日 | 0 0 L * * = 毎月末日 |
W | 平日 | 指定日に最も近い平日 | 0 0 15W * * = 15日に最も近い平日 |
# | 第N番 | 月の第N曜日を指定 | 0 9 * * 5#3 = 第3金曜日の9時 |
注意: ?、L、W、# は標準のcrontabやGitHub Actionsでは使用できません。Quartz Scheduler(Java/Spring)やAWS EventBridgeなど特定の環境でのみ有効です。
特殊文字列(ショートカット)
crontabでは、よく使うスケジュールを簡潔に指定できる特殊文字列が用意されています。
| 文字列 | 等価なCron式 | 説明 |
|---|
@yearly | 0 0 1 1 * | 年1回(1月1日 0:00) |
@annually | 0 0 1 1 * | @yearlyと同じ |
@monthly | 0 0 1 * * | 月1回(毎月1日 0:00) |
@weekly | 0 0 * * 0 | 週1回(毎週日曜 0:00) |
@daily | 0 0 * * * | 日1回(毎日 0:00) |
@midnight | 0 0 * * * | @dailyと同じ |
@hourly | 0 * * * * | 時1回(毎時 0分) |
@reboot | - | システム起動時に1回実行 |
bash# crontabファイルでの使用例
@daily /usr/local/bin/backup.sh
@hourly /usr/local/bin/sync.sh
@reboot /usr/local/bin/startup.sh
よく使うパターン
実務で頻繁に使われるCron式パターンの一覧です。
基本パターン
| Cron式 | 説明 |
|---|
* * * * * | 毎分 |
0 * * * * | 毎時0分(毎正時) |
0 0 * * * | 毎日 0:00 |
0 9 * * * | 毎日 9:00 |
0 9 * * 1-5 | 平日(月〜金)の 9:00 |
0 0 1 * * | 毎月1日 0:00 |
0 0 1 1 * | 毎年1月1日 0:00 |
間隔パターン
| Cron式 | 説明 |
|---|
*/5 * * * * | 5分ごと |
*/15 * * * * | 15分ごと |
*/30 * * * * | 30分ごと |
0 */2 * * * | 2時間ごと |
0 */6 * * * | 6時間ごと |
0 */12 * * * | 12時間ごと |
曜日パターン
| Cron式 | 説明 |
|---|
0 9 * * 1 | 毎週月曜日 9:00 |
0 9 * * 0 | 毎週日曜日 9:00 |
0 9 * * 1-5 | 平日(月〜金) 9:00 |
0 9 * * 6,0 | 週末(土日) 9:00 |
0 9 * * 1,3,5 | 月・水・金 9:00 |
実用例
具体的なユースケースに対応するCron式の例です。
| ユースケース | Cron式 | 説明 |
|---|
| 毎日深夜バックアップ | 0 2 * * * | 毎日 2:00 に実行 |
| 毎週月曜レポート送信 | 0 9 * * 1 | 毎週月曜 9:00 に実行 |
| 毎月1日の月次処理 | 0 0 1 * * | 毎月1日 0:00 に実行 |
| 営業時間中の定期監視 | */5 9-18 * * 1-5 | 平日 9:00〜18:55 の5分ごと |
| ログローテーション | 0 0 * * 0 | 毎週日曜 0:00 に実行 |
| SSL証明書更新チェック | 0 3 * * * | 毎日 3:00 に実行 |
| データベースバキューム | 30 2 * * 0 | 毎週日曜 2:30 に実行 |
| 四半期レポート | 0 9 1 1,4,7,10 * | 1月・4月・7月・10月の1日 9:00 |
bash# crontabファイルの記述例
# 毎日2時にバックアップスクリプトを実行
0 2 * * * /usr/local/bin/backup.sh >> /var/log/backup.log 2>&1
# 平日9時にレポートを送信
0 9 * * 1-5 /usr/local/bin/send-report.sh
# 5分ごとにヘルスチェック
*/5 * * * * curl -s https://example.com/health > /dev/null
Cron式はプラットフォームによってフォーマットや対応する機能が異なります。使用する環境に合わせて確認してください。
標準crontab(Linux/Unix)
| 項目 | 内容 |
|---|
| フォーマット | 5フィールド(分 時 日 月 曜日) |
| 管理コマンド | crontab -e(編集)、crontab -l(一覧) |
| タイムゾーン | システムのタイムゾーン |
| 特殊文字列 | @yearly @monthly @weekly @daily @hourly @reboot に対応 |
bash# crontab管理コマンド
crontab -e # crontabを編集
crontab -l # 現在のcrontabを表示
crontab -r # crontabを削除(注意)
crontab -u user -l # 指定ユーザーのcrontabを表示
GitHub Actions
| 項目 | 内容 |
|---|
| フォーマット | 5フィールド(分 時 日 月 曜日) |
| タイムゾーン | 常にUTC(日本時間はUTC+9なので注意) |
| 最短間隔 | 5分(それより短い間隔は無視される) |
| 制限事項 | L W # ? は使用不可 |
yaml# GitHub Actions workflow の例(.github/workflows/scheduled.yml)
on:
schedule:
# 日本時間の毎日9時(UTCでは0時)に実行
- cron: '0 0 * * *'
# 日本時間の平日18時(UTCでは9時)に実行
- cron: '0 9 * * 1-5'
AWS EventBridge(CloudWatch Events)
| 項目 | 内容 |
|---|
| フォーマット | 6フィールド(分 時 日 月 曜日 年) |
| タイムゾーン | UTC |
| 必須ルール | 日と曜日の片方に必ず ? を使う |
| 拡張文字 | L W # に対応 |
text# AWS EventBridge cron式の例
cron(0 9 ? * MON-FRI *) # 平日UTCの9時
cron(0 0 1 * ? *) # 毎月1日の0時
cron(0 18 ? * MON-FRI *) # 平日UTCの18時(JST翌3時)
Quartz Scheduler(Java / Spring)
| 項目 | 内容 |
|---|
| フォーマット | 6-7フィールド(秒 分 時 日 月 曜日 [年])。標準crontabの5フィールドの先頭に秒フィールド(0-59)が追加される |
| 必須ルール | 日と曜日の片方に必ず ? を使う |
| 拡張文字 | L W # ? すべてに対応 |
java// Spring Boot での使用例(@Scheduled アノテーション)
@Scheduled(cron = "0 0 9 * * MON-FRI") // 平日9時
@Scheduled(cron = "0 0 0 L * ?") // 毎月末日0時
@Scheduled(cron = "0 0 9 ? * 6#3") // 第3金曜日9時