Cron 表達式:排程任何事情而不用猜測
那些神秘的 cron 排程字串終於解釋清楚了。從五個欄位的含義到常見排程模式,學習寫出第一次就能正確執行的 cron 表達式。
0 0 * * * — 這是什麼意思?
如果你使用過 AWS Lambda、GitHub Actions 或任何任務排程器,你就見過 cron 表達式。五個或六個神秘的欄位,不知怎麼就能排程工作。
它們沒有看起來那麼複雜。
五個欄位
┌───────────── 分鐘 (0 - 59)
│ ┌───────────── 小時 (0 - 23)
│ │ ┌───────────── 日期 (1 - 31)
│ │ │ ┌───────────── 月份 (1 - 12)
│ │ │ │ ┌───────────── 星期 (0 - 6, 星期日 = 0)
│ │ │ │ │
* * * * *
每個欄位限制工作何時執行。* 表示「每個」。數字表示「只有那個值」。
讀取範例
0 0 * * * — 分鐘 0,小時 0,任何日期,任何月份,任何工作日 = 每天午夜
30 8 * * 1-5 — 上午 8:30,星期一到星期五 = 工作日早晨
0 */2 * * * — 每 2 小時 = 凌晨 2 點、4 點、6 點...
0 9 1 * * — 每月 1 日上午 9 點 = 月報時間
特殊字符
* — 每個值(每分鐘、每小時等)
, — 多個值。1,15 表示 1 日和 15 日。
- — 範圍。1-5 表示 1 到 5。
/ — 步進。*/15 表示每 15。分鐘欄位中的 */15 = 每 15 分鐘。
常見模式
每 5 分鐘: */5 * * * *
每小時的第 30 分鐘: 30 * * * *
每天凌晨 3 點: 0 3 * * *
每週日午夜: 0 0 * * 0
每月 1 日上午 9 點: 0 9 1 * *
工作日下午 6 點: 0 18 * * 1-5
陷阱
星期 vs 日期。 如果你兩者都設定,大多數系統會將它們進行 OR 運算。0 0 1 * 1 在 1 日和每個星期一執行,而不僅僅是 1 日的星期一。
時區很重要。 大多數 cron 系統使用伺服器時間或 UTC。知道你在處理哪一個。
6 欄位 vs 5 欄位。 有些系統在開頭添加秒欄位。0 0 0 * * * 使用秒欄位會是午夜。
星期日 = 0 或 7。 取決於系統。星期日兩者通常都可以。
部署前測試
不要猜測 0 0 */2 * * 是每 2 天還是每 2 小時執行。使用 cron 解析器。
執行幾個預期的觸發時間。確保它們符合你的意圖。
對於關鍵工作,設定監控。一個欄位錯誤的 cron 表達式可能會讓你的每日工作每小時執行——或讓你的每小時工作每年執行一次。
Cron 的替代方案
英文語法。 有些排程器接受「every day at 3pm」而不是 0 15 * * *。更清楚但可移植性較差。
Rate 表達式。 AWS 使用 rate(5 minutes) 以及 cron 表達式。對於簡單的間隔更容易。
Systemd timers。 Linux 的 cron 替代方案,具有更好的日誌記錄和依賴管理。
Cron 表達式密集但可學習。五個欄位,每個限制工作何時執行。測試你的表達式,注意你的時區,你就能可靠地排程任何事情。