DevTool 團隊

每分鐘、每小時、每天跑一次:Cron 表達式速記與線上產生實戰

定時任務到底該寫哪一串?這篇按場景給答案:每分鐘、每小時、每天零點、每週一早、每月一號、工作日早高峰的 Cron 表達式逐個拆解,順帶說清 crontab 5 段與 Quartz 6 段的區別、下次執行時間怎麼核對。

場景先於語法

絕大多數定時需求就六七種:每分鐘輪詢、每小時清理、每天凌晨跑批、每週一彙總、每月一號結算、工作日早上提醒。先按場景抄表達式,再理解欄位,是掌握 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。

最高頻的三個筆誤

  1. 每小時寫成每分鐘:* * * * * 與 0 * * * * 只差一個字元,含義天差地別——前者每分鐘跑一次。想清楚分鐘位該填什麼再寫。
  2. 日和週打架:crontab 裡日和週同時指定是「或」關係(任一滿足即執行),不是「且」。想表達「每月 1 號且是週一」需要條件判斷,單靠表達式做不到。
  3. 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 次執行時間,與預期對照最快。生產環境再配合日誌的首條執行時間複核;跨時區部署時注意執行時間按伺服器時區計算。