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–2324時間表記
1–31
1–12JAN–DECも可(環境依存)
曜日0–70と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=日曜)
│ │ │ │ │ │ ┌───────────── 年 (省略可)
│ │ │ │ │ │ │
* * * * * * *
項目標準cronQuartz cron
フィールド数56(秒追加)または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 / @annually0 0 1 1 *毎年1月1日
@monthly0 0 1 * *毎月1日
@weekly0 0 * * 0毎週日曜
@daily / @midnight0 0 * * *毎日0時
@hourly0 * * * *毎時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(分 時 日 月 曜日 年)
項目標準cronEventBridge
フィールド数56(年が追加)
なしなし
曜日の値0–7SUN–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 * * 0Sun *-*-* 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式の検証ツール

式が正しいか確認するためのオンラインツール。

参考リンク