Cron表示式解析器與下次執行時間計算
解析cron表示式(分 時 日 月 星期),用通俗語言展示排程規則,支援步長、範圍、逗號列表等語法,並自動計算接下來5次執行時間。適合檢視crontab或GitHub Actions的定時任務設定。
Cron表示式語法(5個欄位)
cron表示式從左到右由5個用空格分隔的欄位組成:分鐘、小時、日期、月份、星期。每個欄位可使用以下特殊字元。
| 位置 | 欄位 | 允許範圍 |
|---|---|---|
| 1 | 分鐘 | 0-59 |
| 2 | 小時 | 0-23 |
| 3 | 日期(幾號) | 1-31 |
| 4 | 月份 | 1-12 |
| 5 | 星期 | 0-7 |
星期欄位通常0=星期日、6=星期六,但本工具也接受部分cron實現使用的7作為星期日的別名(內部按0處理)。
每個欄位都可以使用"*"(任意值)、逗號分隔的列表(1,15,30)、連字元範圍(1-5)以及斜槓步長(*/15、1-30/5),並且這些語法可以自由組合。
常見的cron模式
| cron表示式 | 含義 |
|---|---|
| * * * * * | 每分鐘執行一次。 |
| */5 * * * * | 每5分鐘執行一次。 |
| 0 * * * * | 每小時的第0分鐘執行一次。 |
| 0 0 * * * | 每天0點0分(凌晨)執行。 |
| 0 9 * * 1-5 | 工作日(週一至週五)的9點執行。 |
| 0 0 1 * * | 每月1號0點0分執行。 |
| 0 0 1 1 * | 每年1月1日0點0分執行。 |
| */15 9-17 * * 1-5 | 工作日9點到17點之間,每15分鐘執行一次。 |
什麼是 Cron 運算式
Cron 運算式是把「反覆執行的處理何時運行」以一行寫出的記法。自左而右以空格分隔「分・時・日(日期)・月・星期」五個欄位,各欄位可組合 *(全部)、以逗號列舉、以連字號表範圍、以斜線表間隔來指定。*/15 9-17 * * 1-5 即為「平日9時至17時每15分鐘」之意。
本工具會解析所輸入的運算式,**先以文字說明該排程的含義,再算出自目前時刻起接下來將執行的5個日期時間**。各欄位的明細亦並列顯示,可確認是哪一部分在起作用。星期以0=週日〜6=週六為標準,但部分實作所用的7=週日寫法本工具亦予接受,內部按0處理。下次執行的搜尋範圍約為4年,若其中沒有相符的日期時間,便會予以提示。
Cron 運算式解析器的使用方式
- 輸入 Cron 運算式 以空格分隔填入「分 時 日 月 星期」五項。欄位數或取值範圍不符便會報錯。
- 按下「解析」 會以文字顯示該排程的含義。請先在此確認是否把自己的運算式讀錯了。
- 確認欄位的明細 會逐一列出分、時、日、月、星期各自所指。可據以發現是否有不該填值的欄位被填了值。
- 查看下次的執行預定 會以日期時間給出自目前時刻起的5次。諸如指定「每月31日」這類在某些月份並不存在的日期,其與本意的落差會以具體日期呈現。
- 照抄常見的模式 表中彙總了每分鐘、每5分鐘、每小時0分、平日9時等常用模式。以最接近者為底加以改寫是捷徑。
用好本工具的小技巧
- 像"*/15 9-17 * * 1-5"這樣,逗號列表、連字元範圍與斜槓步長可以自由組合使用。
- 星期欄位通常是0-6(星期日至星期六),但本工具也接受部分cron實現使用的7作為星期日的別名。
- 如果日期欄位和星期欄位都被限制為非"*",按照標準cron規範,兩者是"或"的關係——只要滿足其中一個條件就會執行。
- GitHub Actions的schedule觸發器使用與本工具相同的5欄位cron語法,因此也可以用來確認工作流的執行時間。
- 實際執行時間會受伺服器時區設定影響,修改crontab後,建議同時確認一下伺服器的當前時間。
Cron 運算式解析器的應用情境
寫入 crontab 之前先確認含義
在登錄到伺服器之前先行解析,可避免「運行得比預想頻繁」或「完全不運行」這類事故。
確認 GitHub Actions 的排程
寫在工作流程 schedule 中的運算式同樣是這五欄位的記法。可由下次執行的一覽查看間隔是否合乎本意。
讀懂他人所寫的運算式
當接手的設定中出現 0 */6 * * * 這類運算式時,轉為文字即可立刻明白它在幾時運行。
排查執行時間偏差的原因
當「本該運行的時刻卻沒運行」時,查看下次執行的一覽即可分辨原因究竟出在運算式本身,還是別的因素。
與 Cron 運算式相關的用語
- cron
- 指類 Unix 系統中於既定時刻反覆執行處理的機制。記載執行內容與時刻對應關係的清單稱為 crontab。
- 欄位
- 指以空格分隔 Cron 運算式所得的各要素。自左而右為分(0〜59)、時(0〜23)、日(1〜31)、月(1〜12)、星期(0〜6)五項。
- 星號(*)
- 表示該欄位所能取的全部值。置於分即為「每分鐘」,置於月即為「每月」。
- 步長(/)
- 寫作
*/15之類以指定間隔。如「每15分鐘」那樣,在範圍之內按固定步幅跳選。 - 範圍(-)
- 寫作
1-5以一併指定連續的值。置於星期即為週一至週五,置於時即為1時至5時。 - 星期的編號
- 0為週日,6為週六。部分實作亦接受7作為週日,本工具同樣把7視同0處理。
- 時區
- cron 通常以運行方所處環境的時刻來解釋。若伺服器的時刻設定與預想不同,同一運算式的執行時刻便會隨之偏移。
常見問題
閒話 ― cron的半個世紀
cron這個名字據說源自希臘語中意為"時間"的Chronos(克羅諾斯),自20世紀70年代UNIX誕生之初就作為經典的任務排程工具存在。僅用5個欄位就能表達從"每分鐘"到"每年某個特定日期"的排程規則,這種簡潔的語法即便在近半個世紀後的今天依然被廣泛使用。
如今,這種5欄位的cron語法不僅用於Linux伺服器的crontab,也被GitHub Actions、GitLab CI、Kubernetes的CronJob等眾多CI/CD工具和容器平臺直接採用為定時任務的配置方式。一種誕生於UNIX時代的語法,至今仍在雲原生環境中原封不動地被使用,這本身就是一件有趣的事。
cron語法中最容易讓人困惑的一點,就是同時指定日期和星期時的行為。人們往往直覺認為這是"且"的關係(同時滿足兩者),但實際規範卻是"或"的關係(滿足其中之一即可),這也是任務執行頻率與預期不符的常見原因之一。