Utilo

cron表示式示例:30個時間表解釋 (有陷)

學習cron語法欄位為欄位,複製30個測試過的cron表示式每N分鐘,平日,月度工作,營業時間等,加上時區陷。

· 7 分鐘閱讀

自20世紀70年代以來,Cron已經在Unix系統上安排了重複工作,其五個欄位的語法現在驅動了Kubernetes CronJobs,GitHub Actions,雲排程器如AWS EventBridge和Google雲排程器,CI管道和無數的工作庫。語法非常緊,但非常細緻,。這本指南解釋了每一個領域,然後列出了30個實用的表示式,並列出了陷的說明。

五個領域

┌───────────── minute (0–59)
│ ┌─────────── hour (0–23)
│ │ ┌───────── day of month (1–31)
│ │ │ ┌─────── month (1–12 or JAN–DEC)
│ │ │ │ ┌───── day of week (0–6 or SUN–SAT; 7 is also Sunday on most systems)
│ │ │ │ │
* * * * *

每個欄位都接受:

  • * 每一個值。
  • 一個數字 5 恰恰意味著5。
  • 一個列表 1,15 表示 1 和 15。
  • 一個範圍 9-17 表示包括 9 到 17。
  • 一個步 */15 表示從最小值開始的每15個值;10-50/20 表示10,30,50。

噹噹前時間匹配所有欄位時,就會執行一個任務,除了下面的一個重要例外。將任何表示式貼上到[cron表示式解析器] (/tools/cron-parser) 中,以檢視平面語言描述和下一個執行時間。

每N分鐘或每小時

  1. 每分鐘都會有* * * * *
  2. */5 * * * * — every 5 minutes (at :00,:05,:10 ...)。
  3. 每隔15分鐘就會出現*/15 * * * *。
  4. 0,30 * * * * — every half hour,on the hour and half past。
  5. 7 * * * * — every hour at 7 minutes past。選擇一個奇怪的時間分鐘,
  6. 0 */2 * * * — every 2 hours,at 00:00,02:00,04:00 ..。
  7. 0 */6 * * * 每天四次:00點,06點,12點,18點
  8. 15 8-18/2 * * * — at 08:15,10:15,12:15,14:15,16:15 and 18:15。

在每一個邊界都會重新啟動。*/7 in the minute field fires at :00,:07 ..。:56 and then :00 again,so the gap across the hour is 4 minutes,not 7。如果您需要一個真正的固定間隔,不分60時,使用一個支援間隔的排程器,

每日時間表

  1. 0 0 * * * — every day at midnight。
  2. 30 2 * * * — every day at 02:30,a classic backup window。
  3. 0 9,17 * * * — at 09:00 and 17:00 daily。
  4. 0 12 * * * — at noon。
  5. 45 23 * * * — at 23:45,just before midnight for end-of-day reports。

坑:**在當地時間1點到3點之間的工作可以跳過或在夏令時轉換時兩次執行。如果您的伺服器使用的是DST的區域,請在該視窗之外安排關鍵任務,或者在UTC中執行伺服器。

工作日和週末

  1. 0 9 * * 1-5 09:00 週一至週五
  2. */10 9-17 * * 1-5 每10分鐘在平日營業時間 (最後一次執行時間為17:50)。
  3. 0 10 * * 6,0 — 10:00 on Saturday and Sunday。
  4. 0 8 * * MON — 08:00 every Monday。名稱在大多數實現中都是小寫不敏感的。
  5. 30 16 * * 5 星期五16點30分

每月和每年

  1. 0 0 1 * * — midnight on the first day of every month。
  2. 0 6 15 * * — 06:00 on the 15th of each month。
  3. 0 0 1,15 * * — on the 1st and 15th,common for payroll。
  4. 0 0 1 1 * 1月1日午夜。
  5. 0 9 1 */3 * 每個季度的第一天 (一月,四月,七月,十月) 09:00
  6. 0 0 L * * 月的最後一天。注: L 是由Quartz,一些雲排程器和一些庫支援的擴充套件程式,但不是經典的Unix cron。
  7. 0 22 28-31 * *結合指令碼內部的檢查 ([ "$(date -d tomorrow +%d)" = "01" ]) 可移植的方式在月的最後一天執行標準cron。

月日還是週日?

  1. 0 9 13 * 5 很多人讀成是"十三日星期五"。在經典的cron中,它意味著每個月的13日和每個星期五。當兩個日期欄位都被限制時 (*也沒有),Vixie cron及其後代在****匹配時執行任務。

為了只在13日星期五執行,請安排0 9 13 * *並檢查指令碼中的工作日,或者使用具有明確AND語義的排程器。這是cron中最令人驚的規則,值得記住。

特殊的弦

許多cron實現都接受快捷方式:

  1. 我們可以使用 @hourly 和 0 * * * *
  2. @daily or @midnight — 0 0 * * *。
  3. @weekly — 0 0 * * 0.
  4. @reboot — once at startup (Unix cron only;not available in Kubernetes or GitHub Actions)。

平臺差異

  • 在 Kubernetes CronJobs 中使用標準五欄位語法。自 Kubernetes 1.27 開始,您可以設定 spec.timeZone: "Europe/Berlin";否則,時間表遵循控制器管理員的區域,通常是 UTC。
  • GitHub Actions的時間表始終以 UTC 執行,在高負載期間可以延遲,最小間隔為 5 分鐘。如果準確性很重要,請避免0 * * * *;選擇奇數分鐘。
  • AWS EventBridge使用六個欄位 (minute hour day-of-month month day-of-week year) 並要求?在兩個日期欄位中的一個。
  • ** 石英 (Java) ** 和 ** 春季** 使用六個或七個欄位,第一秒:0 0 9 * * MON-FRI。
  • 系統定時器使用不同的,更易讀的語法 (OnCalendar=Mon..Fri 09:00) 和處理錯過的執行與Persistent=true。

在複製表示式之前,始終確認平臺希望使用哪種方言。

時間區

克朗評估了排程器的時區中的表示式。一個由東京開發人員寫成的0 9 * * *工作在東京的UTC伺服器上執行於09:00 UTC。建議:

  • 在 UTC 中執行伺服器和排程器,並在編寫排程時將預期的本地時間轉換為 UTC。
  • 如果一個工作必須遵循當地的營業時間,在 DST 變化中,使用支援明確時區的排程器。
  • 記錄每個執行時間的時間在 UTC 檢視Unix時間指南 為什麼。

讓就業機會更強

正確的定時只是戰鬥的一半:

  • 防止重疊. 如果一個任務可以執行時間超過其間隔,請使用鎖 (在Unix中flock,在Kubernetes中concurrencyPolicy: Forbid)。
  • 使工作變得無效. 一個工作經過兩次嘗試,例如在重新嘗試或日間時間重疊後,不應該對客戶加倍收費。
  • 捕獲輸出. 經典的cron電子郵件輸出給本地使用者,通常無處可找到。轉向日誌,並對故障進行警報。
  • 使用絕對路徑. Cron執行在最小環境和PATH下;在cron下,你中執行的指令碼通常會失敗。
  • 靜音監視器. 一個心跳服務,當一個工作沒有檢查時會提醒你,

總結

克朗的五個欄位分鐘,小時,月份,月份,週日,加上列表,範圍和步驟,幾乎涵蓋每一個重複的時間表。當兩個日期欄位都設定時,注意OR規則,在邊界重置的步驟,在01:0003:00左右的DST,以及具有額外欄位的平臺方言。驗證每個表示式的解析器顯示即將執行之前部署它。

本頁內容由英文自動翻譯而來,如發現錯誤,歡迎告訴我們。

相關指南