cron式リファレンス - スケジュール設定の書き方と実践パターン
cron式(cron expression)は、タスクの実行スケジュールを定義するための書式。LinuxのcrontabだけでなくAWS EventBridgeやGitHub Actionsなど多くのシステムで採用されている。
フィールド構成
標準cron(5フィールド)
Linuxのcrontabで使われる形式。左から順に以下の5つのフィールドで構成される。
┌───────────── 分 (0-59)
│ ┌───────────── 時 (0-23)
│ │ ┌───────────── 日 (1-31)
│ │ │ ┌───────────── 月 (1-12)
│ │ │ │ ┌───────────── 曜日 (0-7, 0と7は日曜)
│ │ │ │ │
* * * * *
| フィールド | 値の範囲 | 備考 |
|---|---|---|
| 分 | 0–59 | |
| 時 | 0–23 | 24時間表記 |
| 日 | 1–31 | |
| 月 | 1–12 | JAN–DECも可(環境依存) |
| 曜日 | 0–7 | 0と7が日曜、SUN–SATも可(環境依存) |
Quartz cron(6–7フィールド)
Java の Quartz Scheduler で使われる拡張形式。AWS EventBridge もこの形式を採用している。
┌───────────── 秒 (0-59) ※Quartzのみ
│ ┌───────────── 分 (0-59)
│ │ ┌───────────── 時 (0-23)
│ │ │ ┌───────────── 日 (1-31)
│ │ │ │ ┌───────────── 月 (1-12)
│ │ │ │ │ ┌───────────── 曜日 (1-7, 1=日曜)
│ │ │ │ │ │ ┌───────────── 年 (省略可)
│ │ │ │ │ │ │
* * * * * * *
| 項目 | 標準cron | Quartz cron |
|---|---|---|
| フィールド数 | 5 | 6(秒追加)または7(秒+年) |
| 秒フィールド | なし | あり(先頭) |
| 曜日の値 | 0–7(0,7=日曜) | 1–7(1=日曜) |
?(未指定) | 非対応 | 日・曜日フィールドで使用可 |
L, W, # | 非対応 | 対応 |
特殊文字
基本的な特殊文字(標準cron・Quartz共通)
| 文字 | 意味 | 例 | 説明 |
|---|---|---|---|
* | すべての値 | * * * * * | 毎分実行 |
, | 複数の値を列挙 | 0,30 * * * * | 0分と30分に実行 |
- | 範囲指定 | 0 9-17 * * * | 9時〜17時の毎時0分に実行 |
/ | 間隔指定 | */5 * * * * | 5分おきに実行 |
/(ステップ値)の詳細
*/5 * * * * # 0,5,10,15,...,55分に実行(0分起点で5分間隔)
10/5 * * * * # 10,15,20,25,...,55分に実行(10分起点で5分間隔)
0 */2 * * * # 0,2,4,...,22時の0分に実行(2時間おき)
Quartz cron 拡張の特殊文字
| 文字 | 使用可能フィールド | 意味 | 例 | 説明 |
|---|---|---|---|---|
? | 日、曜日 | 値を指定しない | 0 0 * * ? | 日と曜日の一方を?にする |
L | 日、曜日 | Last(最後の) | 0 0 L * ? | 月の最終日に実行 |
W | 日 | 最も近い営業日(平日) | 0 0 15W * ? | 15日に最も近い営業日に実行 |
# | 曜日 | 第N週の指定曜日 | 0 0 ? * 2#1 | 第1月曜日に実行 |
LW | 日 | 月の最終営業日 | 0 0 LW * ? | 月の最終営業日に実行 |
L(Last)の使用例
# 日フィールド
0 0 L * ? # 毎月の最終日
0 0 L-3 * ? # 毎月の最終日の3日前
# 曜日フィールド
0 0 ? * 6L # 毎月の最終金曜日(Quartz: 6=金曜)
#(第N曜日)の使用例
0 0 ? * 2#1 # 毎月の第1月曜日(Quartz: 2=月曜)
0 0 ? * 6#3 # 毎月の第3金曜日
よく使うパターン集
基本パターン(標準cron)
| パターン | cron式 | 説明 |
|---|---|---|
| 毎分 | * * * * * | 全フィールド* |
| 5分おき | */5 * * * * | |
| 毎時0分 | 0 * * * * | |
| 毎日0時 | 0 0 * * * | 深夜0:00 |
| 毎日9時 | 0 9 * * * | |
| 毎日9時30分 | 30 9 * * * | |
| 平日の毎日9時 | 0 9 * * 1-5 | 月〜金 |
| 毎週月曜9時 | 0 9 * * 1 | |
| 毎月1日の0時 | 0 0 1 * * | |
| 毎月15日の12時 | 0 12 15 * * | |
| 毎年1月1日の0時 | 0 0 1 1 * |
業務でよく使うパターン
# 営業時間中(9-18時)に15分おきに実行
*/15 9-18 * * 1-5
# 毎日の業務開始前(8:55)に実行
55 8 * * 1-5
# 月末処理(28日〜31日の0時、存在しない日は無視される)
0 0 28-31 * *
# 四半期ごと(1,4,7,10月の1日)に実行
0 0 1 1,4,7,10 *
# 2時間おきに実行(偶数時)
0 */2 * * *
# 30分おきに実行(営業時間中のみ)
0,30 9-17 * * 1-5
# 毎日深夜にログローテーション
0 2 * * *
# 毎週日曜3時にフルバックアップ
0 3 * * 0
タイムゾーンの注意
標準のcrontabはシステムのタイムゾーンに従う。UTCで動作するサーバーではJSTとの時差(-9時間)を考慮する必要がある。
# JST 9:00に実行したい場合(UTCサーバー)
0 0 * * * # UTC 0:00 = JST 9:00
crontabコマンド
基本操作
# 現在のユーザーのcrontabを表示
crontab -l
# crontabを編集(エディタが開く)
crontab -e
# crontabを削除(全件削除、確認なし)
crontab -r
# 別ユーザーのcrontabを表示(root権限が必要)
crontab -l -u username
# ファイルからcrontabを読み込み(上書き)
crontab mycrontab.txt
crontabファイルの書式
# 環境変数の設定
SHELL=/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
MAILTO=admin@example.com
# ジョブ定義
# 分 時 日 月 曜日 コマンド
0 2 * * * /usr/local/bin/backup.sh
*/5 * * * * /usr/local/bin/health-check.sh >> /var/log/health.log 2>&1
0 9 * * 1-5 /usr/local/bin/report.sh | mail -s "Daily Report" admin@example.com
よく使うテクニック
# 標準出力・標準エラーをログに記録
* * * * * /path/to/script.sh >> /var/log/cron.log 2>&1
# 出力を破棄(メール通知を抑制)
* * * * * /path/to/script.sh > /dev/null 2>&1
# 複数コマンドの実行
0 0 * * * /path/to/cmd1.sh && /path/to/cmd2.sh
# 環境変数を渡す
0 0 * * * export ENV=production; /path/to/deploy.sh
# ロックファイルで多重起動を防止(flockを使用)
* * * * * flock -n /tmp/myjob.lock /path/to/script.sh
定義済みショートカット(一部のcron実装で対応)
| ショートカット | 等価なcron式 | 説明 |
|---|---|---|
@reboot | — | システム起動時に1回実行 |
@yearly / @annually | 0 0 1 1 * | 毎年1月1日 |
@monthly | 0 0 1 * * | 毎月1日 |
@weekly | 0 0 * * 0 | 毎週日曜 |
@daily / @midnight | 0 0 * * * | 毎日0時 |
@hourly | 0 * * * * | 毎時0分 |
cronのログ確認
# systemd環境(Ubuntu/Debian系)
journalctl -u cron
journalctl -u cron --since "1 hour ago"
# syslog
grep CRON /var/log/syslog
# cron実行履歴の確認(CentOS/RHEL系)
grep CRON /var/log/cron
各サービスでのcron式の違い
AWS EventBridge(CloudWatch Events)
EventBridgeのスケジュール式は2種類ある。
rate式
rate(1 minute)
rate(5 minutes)
rate(1 hour)
rate(1 day)
値が1の場合は単数形(minute)、2以上は複数形(minutes)を使う。
cron式
6フィールド形式(秒フィールドなし、年フィールドあり)。標準cronともQuartzとも異なる独自仕様。
cron(分 時 日 月 曜日 年)
| 項目 | 標準cron | EventBridge |
|---|---|---|
| フィールド数 | 5 | 6(年が追加) |
| 秒 | なし | なし |
| 曜日の値 | 0–7 | SUN–SAT または 1–7 |
? | 非対応 | 日・曜日の一方に必須 |
L, W | 非対応 | 対応 |
| タイムゾーン | システム依存 | UTC(デフォルト) |
# 毎日UTC 9:00(JST 18:00)に実行
cron(0 9 * * ? *)
# 毎日JST 9:00(UTC 0:00)に実行
cron(0 0 * * ? *)
# 平日の毎朝UTC 0:00
cron(0 0 ? * MON-FRI *)
# 毎月最終日
cron(0 0 L * ? *)
# 毎月第1月曜日
cron(0 0 ? * 2#1 *)
注意点:
- 日と曜日を同時に
*にできない。一方を?にする必要がある - タイムゾーンはデフォルトUTC。EventBridge Schedulerではタイムゾーン指定が可能
GitHub Actions
on.scheduleで使用。標準の5フィールド形式だがUTCで評価される。
on:
schedule:
# 毎日UTC 0:00(JST 9:00)に実行
- cron: '0 0 * * *'
# 平日のUTC 1:00(JST 10:00)に実行
- cron: '0 1 * * 1-5'
# 15分おきに実行
- cron: '*/15 * * * *'
注意点:
- タイムゾーンはUTC固定(変更不可)
- 高負荷時は実行が遅延する場合がある(正確なリアルタイム性は保証されない)
- 最短間隔は5分(
*/1と書いても5分おきに制限される) - 複数のscheduleを定義可能
Kubernetes CronJob
標準の5フィールド形式を使用。
apiVersion: batch/v1
kind: CronJob
metadata:
name: daily-backup
spec:
schedule: "0 2 * * *"
timeZone: "Asia/Tokyo" # v1.27以降で対応
concurrencyPolicy: Forbid # 前のジョブが完了するまで新規起動しない
jobTemplate:
spec:
template:
spec:
containers:
- name: backup
image: myapp:latest
command: ["/bin/sh", "-c", "backup.sh"]
restartPolicy: OnFailure
注意点:
timeZoneフィールドはKubernetes v1.27以降で正式対応concurrencyPolicyで多重起動の制御が可能(Allow,Forbid,Replace)
systemd Timer
systemdでは.timerユニットでスケジュールを定義する。cron式ではなく独自のOnCalendar構文を使う。
# /etc/systemd/system/backup.timer
[Unit]
Description=Daily backup timer
[Timer]
OnCalendar=*-*-* 02:00:00
Persistent=true
[Install]
WantedBy=timers.target
| cron式 | OnCalendar |
|---|---|
0 2 * * * | *-*-* 02:00:00 |
0 0 * * 0 | Sun *-*-* 00:00:00 |
0 0 1 * * | *-*-01 00:00:00 |
*/5 * * * * | *-*-* *:00/5:00 |
トラブルシューティング
よくある問題
| 問題 | 原因 | 対策 |
|---|---|---|
| ジョブが実行されない | PATHが通っていない | crontab内でPATH=を定義するか、コマンドをフルパスで記述 |
| 環境変数が読めない | cronは.bashrcを読まない | crontab内で変数を定義するか、スクリプト内でsourceする |
| メールが大量に届く | 標準出力がメールで送信される | > /dev/null 2>&1でリダイレクト |
| 同一ジョブが多重起動する | 前回の実行が終わる前に次回が起動 | flockでロックを取得する |
| 日と曜日の組み合わせが想定外 | 標準cronでは日と曜日はOR条件 | どちらか一方のみ指定する |
日と曜日のOR条件(標準cron)
標準cronでは日と曜日の両方を指定するとOR条件(どちらかに合致すれば実行)になる。
# 「毎月15日」または「毎週金曜」に実行(AND条件ではない)
0 0 15 * 5
AND条件にしたい場合はスクリプト内で曜日を判定する。
# 15日かつ金曜のみ実行
0 0 15 * * [ "$(date +\%u)" = "5" ] && /path/to/script.sh
cron式の検証ツール
式が正しいか確認するためのオンラインツール。
- crontab.guru — 標準cron式のバリデーションと次回実行時刻の確認
- Cronhub Crontab Generator — GUIでcron式を生成
参考リンク
- crontab(5) - Linux manual page — 標準cronの公式マニュアル
- Quartz Scheduler - CronTrigger Tutorial — Quartz cronの公式ドキュメント
- AWS EventBridge - Schedule Expressions — EventBridgeのスケジュール式
- GitHub Actions - Events that trigger workflows — GitHub Actionsのscheduleトリガー
- Kubernetes - CronJob — Kubernetes CronJobの公式ドキュメント