Cron式の基本構造:5つのフィールド
Cron式(cron expression)とは、コマンドを定期実行する時刻をスペース区切りの数値で表す記法です。POSIXおよびVixie cron系の標準では、以下の5フィールドで構成されます。
各フィールドには単一の値のほか、リスト(1,15)、範囲(1-5)、ステップ(*/10)、そしてすべてを表すワイルドカード(*)を指定できます。曜日は0と7がどちらも日曜を指す点が最初の注意点です。
よく使うパターン例
*/5 * * * * 5分ごと
0 9 * * 1-5 平日の毎朝9時
0 0 1 * * 毎月1日の0時
0 3 * * 0 毎週日曜の午前3時
15 14 1 * * 毎月1日の14:15
特殊文字と拡張構文
標準cronで使えるのは * , - / の4種ですが、Quartzスケジューラなど一部の実装は追加の特殊文字を提供します。これらは標準cronでは使えないため、方言の混同に注意が必要です。
| 文字 | 意味 | 例 | 主な対応実装 |
|---|---|---|---|
* | すべての値 | * * * * * | 全実装 |
/ | ステップ(間隔) | */15 | 全実装 |
L | 最終日/最終曜日 | 6L(最終金曜) | Quartz |
W | 直近の平日 | 15W | Quartz |
# | 第N曜日 | 6#3(第3金曜) | Quartz |
? | 指定なし | 日か曜日の一方に | Quartz |
また多くのVixie cron/cronie系実装は、@reboot @daily @hourly @weekly @monthly @yearly といったマクロをサポートします。ただし後述するGitHub ActionsやKubernetes CronJobではこれらは使えず、5フィールドで書き直す必要があります。
実装ごとの方言:標準cron・Quartz・systemd・CI
「cron式」と一口に言っても、プラットフォームごとにフィールド数や解釈が異なります。移行時にそのまま貼り付けると意図しない動作になるため、差異を把握しておきましょう。
| 項目 | 標準cron | Quartz | systemd timer | GitHub Actions |
|---|---|---|---|---|
| フィールド数 | 5 | 6〜7 | OnCalendar式 | 5 |
| 秒フィールド | なし | あり | あり | なし |
| L / W / # | 非対応 | 対応 | 非対応 | 非対応 |
| @daily等マクロ | 対応 | 非対応 | 省略形あり | 非対応 |
| 最短間隔 | 1分 | 1秒 | 1秒級 | 実質5分 |
| タイムゾーン | システムTZ | 設定可 | 設定可 | UTC基準 |
systemd timerはcron構文とは別物で、OnCalendar=Thu,Fri *-*-1,5 11:12:13 のように日付と時刻を1式に統合します。daily weekly hourly などの省略形も用意されています。書式が根本的に異なるため、crontabからの機械的な移行はできません。
2026年のトレンドとハマりどころ
GitHub Actionsのスケジュール実行は長らくUTC固定で、夏時間(DST)を跨ぐジョブでは実行時刻がずれる課題がありました。2026年時点ではタイムゾーン指定の改善が進んでいると報告されていますが、環境やドキュメントのバージョンによって挙動が異なるため、公式ドキュメントで最新仕様を確認することを推奨します。
もう一つの実務的な注意点として、GitHub Actionsのcronは5分未満の間隔を書いてもエラーにならず黙って無視されるサイレント失敗が起こります。また高負荷時には実行が5〜30分程度遅延しうるため、厳密な時刻精度が必要な用途には向きません。
Cron式は手書きするとフィールドの順序ミスや曜日の0/7混同が起きやすいため、Cron式ジェネレーターのようなツールでGUIから生成し、次回実行時刻をプレビューで確認する運用が安全です。定期実行のログ時刻を扱う際はUnixタイムスタンプ変換、実行間隔の日付計算には日付計算も併用すると便利です。