cron式の解読

5つの欄からなるcron式を日本語に直し、次に走る5回を並べます。説明だけでは半分しか信じられないので、実際の日付を添えています。

分 時 日 月 曜日

月·火·水·木·金曜の9時0分に走ります

分
0
0
時
9
9
日
*
31個の値
月
*
12個の値
曜日
1-5
1,2,3,4,5

日と曜日の両方を指定すると、どちらか一方に当てはまれば走ります(OR)— いちばん間違えられるところです。だから説明ではなく実際の日付を並べています。時刻はこのブラウザの時間帯に従うので、サーバとは違うことがあります。

各欄に書けるもの

* は全部、1,15 は列挙、1-5 は範囲、*/10 は刻みです。範囲に刻みを付けて 1-5/2 と書くこともできます。月は jan〜dec、曜日は sun〜sat と書いてもよく、大文字小文字は区別しません。曜日の 7 は 0 と同じ日曜です。L・W・#・? や @daily のような省略形は読みません — Linux の cron にはない拡張です。

次の実行を数える方法

今から一分後を起点に一分ずつ進めながら、五つの欄すべてに合う時刻を五つ集めます。計算というより暦をめくる作業なので、0 0 31 * * のようにない月がある日も正しく出ますし、0 0 29 2 * は閏年だけに当たります。四年の中で五回そろわなければ、あるぶんだけを見せます — 2 月 30 日のように永遠に来ない日は何も出ません。

式が意味する時刻と実際に走る時刻

次の実行はこのブラウザの時計と時間帯で数えます。サーバの時間帯が違えばその時差だけずれ、夏時間のある地域では時計が切り替わる日に一回飛ぶか、二回走ります。

よくある質問

日と曜日の両方を指定するとどうなりますか

両方ではなく、どちらか一方に当てはまれば走ります。0 0 1 * 1 は「1日が月曜のとき」ではなく、「毎月1日」と「毎週月曜」の両方です。cronでいちばん読み違えられる規則なので、次に走る時刻を併せて出しています。

秒単位のcronも読めますか

5つの欄(分・時・日・月・曜日)だけです。6つの欄はQuartzや一部のライブラリの拡張で、先頭が秒になります。その場合は先頭の欄を落としてから貼り付けてください。

どの時間帯で計算していますか

このブラウザの時間帯です。サーバがUTCで動いているなら、実際に走る時刻は違ってきます。

6つの欄がある式を見かけました

それは先頭に秒を置く書き方です。ここが読むのは5つの欄 — 分・時・日・月・曜日 — で、Linuxのcronやたいていのスケジューラが使う形です。6つの欄の式を貼ると欄が一つずつずれるので、先に秒を落としてください。

次に走る時刻はどの時間帯ですか

このブラウザの時間帯 で出しています。実際にはUTCのサーバで走るなら、その差だけずれます — 夜中に走らせる予定を組むときの、よくある落とし穴です。

毎月の最終日に走らせるには

五欄の cron にはそのための書き方がありません。L は Quartz の拡張です。Linux では 0 0 28-31 * * で仕掛けておき、スクリプトの中で「明日が 1 日か」を確かめるのが常道です。ここに入れると 28〜31 日のすべてが次の実行に並びます。

GitHub Actions の schedule も同じ文法ですか

五つの欄は同じですが、時間帯が常に UTC です。日本時間の朝 9 時は 0 0 * * * です。ここではブラウザの時間帯で見せるので、Actions に書く値は九時間を引いたものを入れ、次の実行が合っているか確かめてください。

貼り付けたものはサーバへ送られますか

送られません。すべてブラウザの中で動き、送信も保存もしません。だからこそ、ふつうならウェブページに貼り付けない社内の設定ファイルや本番のクエリにも使えます。通信を切ったままでも動きます。