場景先於語法
絕大多數定時需求就六七種:每分鐘輪詢、每小時清理、每天凌晨跑批、每週一彙總、每月一號結算、工作日早上提醒。先按場景抄表達式,再理解欄位,是掌握 Cron 最快的路徑。
線上 Cron 表達式工具把這條路徑做成了預設動線:預設區一鍵填入,中文含義立即顯示,下面直接給出接下來 5 次執行時間。
高頻場景表達式速記
| 場景 | 表達式 | 說明 |
|---|---|---|
| 每分鐘 | * * * * * |
輪詢、探活 |
| 每 5 分鐘 | */5 * * * * |
步進寫法,指標收集常用 |
| 每小時(第 0 分) | 0 * * * * |
分鐘位 0 + 小時位 * |
| 每天零點 | 0 0 * * * |
日誌切割、跑批 |
| 每週一 9 點 | 0 9 * * 1 |
週位 1=週一(0 或 7=週日) |
| 每月 1 號零點 | 0 0 1 * * |
月結、帳單 |
| 工作日 8:30 | 30 8 * * 1-5 |
週位區間表示週一至週五 |
五個欄位從左到右是:分 時 日 月 週。記憶口訣「分時日月週」,範圍分別是 0-59、0-23、1-31、1-12、0-7。
最高頻的三個筆誤
- 每小時寫成每分鐘:
* * * * *與0 * * * *只差一個字元,含義天差地別——前者每分鐘跑一次。想清楚分鐘位該填什麼再寫。 - 日和週打架:crontab 裡日和週同時指定是「或」關係(任一滿足即執行),不是「且」。想表達「每月 1 號且是週一」需要條件判斷,單靠表達式做不到。
- Quartz 少寫秒位:Spring 專案抄了 Linux crontab 的 5 段表達式,Quartz 排程器會直接報錯——6 段開頭是秒。
Quartz 與 crontab:先確認排程器
| 維度 | crontab | Quartz |
|---|---|---|
| 段數 | 5(分時日月週) | 6(秒+分時日月週) |
| 最小粒度 | 分鐘 | 秒 |
? 佔位 |
不支援 | 日/週之一可用 ? 表示不指定 |
| 生態 | Linux crontab 命令 | Quartz / Spring @Scheduled |
按排程器選格式,別讓表達式跨生態。解析工具頂部有格式切換,貼上錯格式會提示。
怎麼驗證寫對了
最快的方式是看接下來 5 次執行時間:貼進 Cron 表達式線上工具,如果列表裡的時刻和你腦中的預期一致,表達式就是對的;不一致時對照中文含義和逐欄位說明找差異。上線後以日誌的首條執行時間為準複核一遍,跨時區部署記得按伺服器時區折算。
常見問題
Cron 表達式每小時執行一次應該怎麼寫?
0 * * * *:分鐘位填 0,小時位用 *。要在每小時的第 30 分執行就寫 30 * * * *。注意分鐘位寫 * 會變成每分鐘執行一次——這是最高頻的筆誤。
crontab 和 Quartz 的表達式能混用嗎?
不能直接混用。crontab 是 5 段(最小粒度分鐘),Quartz 是 6 段(開頭多一個秒位)。Linux crontab 不認 6 段,Quartz 排程器需要秒位。寫之前先確認排程器類型,解析工具按格式切換即可。
怎麼確認表達式會在預期的時間執行?
把表達式貼進線上解析工具看接下來 5 次執行時間,與預期對照最快。生產環境再配合日誌的首條執行時間複核;跨時區部署時注意執行時間按伺服器時區計算。