DevToolPal
日本語

Cron 式

毎月末日

標準の cron には「末日」を表す記号がないため、28〜31 日に実行し、翌日が 1 日のときだけ続行するシェルの判定を入れます。

0 0 28-31 * * Cron 式パーサーで開く

crontab の行は GNU date(date -d tomorrow)を使っています。macOS では date -v+1d を使ってください。Quartz と Spring は L を直接使えます。Kubernetes や GitHub Actions では、ジョブの最初に同じ日付チェックを入れます。

フィールドごとの解説

フィールド 値 該当
分 0 0
時 0 0
日 28-31 28, 29, 30, 31
月 * すべての値
曜日 * すべての値

次回の実行時刻

例:2026年1月1日 以降の最初の 6 回(UTC)。

  1. 2026年1月31日(土) 00:00
  2. 2026年2月28日(土) 00:00
  3. 2026年3月31日(火) 00:00
  4. 2026年4月30日(木) 00:00
  5. 2026年5月31日(日) 00:00
  6. 2026年6月30日(火) 00:00

そのまま使える書き方

crontab
0 0 28-31 * * [ "$(date -d tomorrow +\%d)" = 01 ] && /path/to/command

crontab -e でこの行を追加します。CRON_TZ や TZ を設定しない限り、サーバーのタイムゾーンで実行されます。

Kubernetes CronJob
apiVersion: batch/v1
kind: CronJob
metadata:
  name: last-day-of-month
spec:
  schedule: "0 0 28-31 * *"
  timeZone: "Etc/UTC"
  concurrencyPolicy: Forbid
  jobTemplate:
    spec:
      template:
        spec:
          restartPolicy: OnFailure
          containers:
            - name: job
              image: busybox:1.36
              command: ["/bin/sh", "-c", "date; echo run"]

spec.timeZone を設定してください(Kubernetes 1.27 以降)。未設定の場合は controller manager のタイムゾーン(通常 UTC)に従います。

GitHub Actions
on:
  schedule:
    - cron: '0 0 28-31 * *'
  workflow_dispatch:

GitHub Actions は常に UTC を使い、間隔は最短 5 分です。混雑時は開始が遅れることがあります。

Quartz
0 0 0 L * ?

Quartz は先頭に秒を置き、日か曜日のどちらかに ? が必要です。曜日は日曜始まりの 1〜7 なので、英語の略称を使うほうが安全です。

Spring
@Scheduled(cron = "0 0 0 L * *")

Spring の @Scheduled(cron = …) は 6 フィールド:秒と通常の 5 フィールドです。

よくある質問

› crontab で % を \% とエスケープするのはなぜ?

crontab の行では % が改行(コマンドへの入力)を意味します。\% と書くと日付の書式がそのままシェルに渡ります。

› 0 0 28-31 * * はどのタイムゾーンで実行されますか?

Cron は実行するマシンやサービスのタイムゾーンを使います。Linux では CRON_TZ や TZ を設定しない限りシステムのタイムゾーン、Kubernetes の CronJob は spec.timeZone で指定でき、GitHub Actions は常に UTC です。

› デプロイ前にスケジュールを確認するには?

このサイトの Cron 式パーサーで 0 0 28-31 * * を開いてください。各フィールドを解説し、今後の実行時刻をローカル時刻または UTC で一覧表示します。処理はすべてブラウザー内です。