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分鐘或每小時
- 每分鐘都會有
* * * * * */5 * * * *— every 5 minutes (at :00,:05,:10 ...)。- 每隔15分鐘就會出現
*/15 * * * *。 0,30 * * * *— every half hour,on the hour and half past。7 * * * *— every hour at 7 minutes past。選擇一個奇怪的時間分鐘,0 */2 * * *— every 2 hours,at 00:00,02:00,04:00 ..。0 */6 * * *每天四次:00點,06點,12點,18點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時,使用一個支援間隔的排程器,
每日時間表
0 0 * * *— every day at midnight。30 2 * * *— every day at 02:30,a classic backup window。0 9,17 * * *— at 09:00 and 17:00 daily。0 12 * * *— at noon。45 23 * * *— at 23:45,just before midnight for end-of-day reports。
坑:**在當地時間1點到3點之間的工作可以跳過或在夏令時轉換時兩次執行。如果您的伺服器使用的是DST的區域,請在該視窗之外安排關鍵任務,或者在UTC中執行伺服器。
工作日和週末
0 9 * * 1-509:00 週一至週五*/10 9-17 * * 1-5每10分鐘在平日營業時間 (最後一次執行時間為17:50)。0 10 * * 6,0— 10:00 on Saturday and Sunday。0 8 * * MON— 08:00 every Monday。名稱在大多數實現中都是小寫不敏感的。30 16 * * 5星期五16點30分
每月和每年
0 0 1 * *— midnight on the first day of every month。0 6 15 * *— 06:00 on the 15th of each month。0 0 1,15 * *— on the 1st and 15th,common for payroll。0 0 1 1 *1月1日午夜。0 9 1 */3 *每個季度的第一天 (一月,四月,七月,十月) 09:000 0 L * *月的最後一天。注:L是由Quartz,一些雲排程器和一些庫支援的擴充套件程式,但不是經典的Unix cron。0 22 28-31 * *結合指令碼內部的檢查 ([ "$(date -d tomorrow +%d)" = "01" ]) 可移植的方式在月的最後一天執行標準cron。
月日還是週日?
0 9 13 * 5很多人讀成是"十三日星期五"。在經典的cron中,它意味著每個月的13日和每個星期五。當兩個日期欄位都被限制時 (*也沒有),Vixie cron及其後代在****匹配時執行任務。
為了只在13日星期五執行,請安排0 9 13 * *並檢查指令碼中的工作日,或者使用具有明確AND語義的排程器。這是cron中最令人驚的規則,值得記住。
特殊的弦
許多cron實現都接受快捷方式:
- 我們可以使用
@hourly和0 * * * * @dailyor@midnight—0 0 * * *。@weekly—0 0 * * 0.@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,以及具有額外欄位的平臺方言。驗證每個表示式的解析器顯示即將執行之前部署它。
本頁內容由英文自動翻譯而來,如發現錯誤,歡迎告訴我們。