cron 運算式由五個以空格分隔的欄位組成——分鐘、小時、每月日期、月份和星期幾——用來告訴傳統的 Unix 風格排程器工作何時執行。若要根據易讀的排程建立運算式,請在 Cron Expression Generator 中選擇預設值,調整該頻率顯示的控制項目,並複製產生的五欄位運算式。此工具支援每分鐘、每 N 分鐘、每小時、每日、工作日、每週及每月的排程,並在操作過程中同時顯示運算式與淺顯英文摘要。當您知道工作的執行時間,但不想手動將其轉換為各欄位值時,這種方式很有用。產生的運算式僅描述時間安排:不包含命令、使用者、環境變數、重試、鎖定或監控。產生作業完全在本地進行,因此無論選取的排程或命令都不會上傳。部署前,仍應確認目的地接受標準五欄位 cron、檢查排程器設定的時區,並在正式環境之外測試排程。託管排程器可能會增加欄位或採用廠商專屬語法,而日光節約時間的變更也可能影響本地掛鐘時間的執行。

how to make cron expression
如何建立 Cron 運算式:實用指南

五個欄位的實際意義

傳統 cron 語法取決於欄位順序及欄位值。每個值所在的位置都會告訴排程器該欄位控制什麼,因此將值移至錯誤的位置可能會改變預定的排程。標準欄位順序與值範圍請參閱 Linux crontab(5) 手冊。

位置 欄位 標準範圍 控制內容
1 分鐘 0–59 每小時中的分鐘
2 小時 0–23 一天中的小時
3 每月日期 1–31 一個月中的日期數
4 月份 1–12 一年中的月份
5 星期幾 0–6 星期幾,從星期日 0 到星期六 6

使用產生器建立的大多數排程都能由三種語法元素涵蓋:

  • 星號: * 表示該欄位中的每個有效值。
  • 斜線: 斜線用來引入步長,例如每 N 分鐘的排程。
  • 包含範圍: 當範圍(例如 1-5)出現在星期幾欄位時,涵蓋星期一至星期五。

當每月日期和星期幾都受到限制時,請特別小心。部分 cron 實作在這種情況下會套用令人意外的類似 OR 行為,也就是只要任一欄位相符,工作就可能執行。產生器內建的預設值會避免同時設定這兩個欄位,讓常見排程在目標排程器上的行為維持可預測性。

選擇排程並產生運算式

請將產生器當成從排程轉為運算式的工作流程使用,不要試圖一次組裝所有五個位置。

  1. 選擇符合工作頻率的排程類型。 選擇每分鐘、每 N 分鐘、每小時、每日、工作日、每週或每月。先選擇最接近的預設值,可減少需要思考的欄位數量,並讓產生的運算式維持在支援的五欄位格式內。
  2. 設定該排程顯示的間隔、分鐘、小時、星期幾或月份日期控制項目。 每 N 分鐘的預設值會使用間隔,而每小時、每日、工作日、每週及每月的預設值則會顯示相關的時間或日曆控制項目。分鐘維持介於 0 和 59 之間,小時介於 0 和 23 之間,星期幾介於星期日 0 和星期六 6 之間,月份日期則介於 1 和 31 之間。請留意五欄位運算式與淺顯英文摘要會立即更新,以便比較機器可讀的結果與預定的執行時間。
  3. 複製運算式,並確認目標排程器與時區。 確認目的地接受標準五欄位 cron,而不是六欄位、七欄位或廠商專屬方言。檢查排程器設定的時區,在目標 crontab 或工作排程器中另外加入命令,並在依賴此設定前於非正式環境中進行測試。

最後一步十分重要,因為語法有效的運算式在不同系統中仍可能以不同方式排程。運算式會指定符合的時間;但不會選擇排程器的時區,也不會定義工作執行時應採取的動作。

比較常見的排程類型

請選擇符合業務規則的排程,而不是分別選取各個欄位。以下是七種常見預設值,以及各自代表的時間安排。

排程預設值 適用情境 相關設定 代表的時間安排
每分鐘 工作必須每分鐘考量一次 選擇預設值 每個有效分鐘
每 N 分鐘 工作遵循固定的分鐘步長 間隔 分鐘欄位中與時鐘對齊的步長
每小時 工作在每個小時的相同分鐘執行 分鐘 每小時中的固定分鐘
每日 工作每天在特定時間執行一次 分鐘和小時 每天的選取時間
工作日 工作遵循星期一至星期五的模式 分鐘、小時和星期幾 工作日的選取時間
每週 工作在選定的星期幾執行 分鐘、小時和星期幾 每週的選取時間
每月 工作在選定的日曆日期執行 分鐘、小時和月份日期 每月的選取日期,視月份長度而定

每 N 分鐘的 cron 排程代表與時鐘對齊的步長,並不保證排程器會在上一個命令完成後等待 N 分鐘。如果工作執行時間會變動,而且間隔必須在完成後才開始,請使用專為這類行為設計的排程器,不要只依賴 cron 運算式。

解碼實用的工作日排程

假設某項工作必須在星期一至星期五的 09:00 執行,其標準五欄位 cron 運算式為 0 9 * * 1-5。

  • 0 會選取該小時的第 0 分鐘。
  • 9 會選取排程器時區中的 09:00。
  • * 允許每個有效的每月日期。
  • * 允許每個有效的月份。
  • 1-5 是涵蓋星期一至星期五的星期幾包含範圍。

淺顯英文的解讀為「星期一至星期五的 09:00」。請注意,只有星期幾欄位受到限制。每月日期與月份欄位仍是萬用字元,避免兩個日曆日期欄位同時受限時可能出現的實作特定行為。產生器可建立同類型的限定標準運算式,不必讓您手動安排各個欄位。

考量時區與排程器方言

檢查排程器的時區

cron 工作會遵循排程器中設定的時區,而該時區可能與電腦上顯示的時區不同。視日光節約時間的切換方式與排程器的實作而定,切換時也可能略過或重複某個本地掛鐘時間。如果預定排程必須與 UTC 綁定,請據此設定目標排程器,不要假設會使用本地電腦的設定。標準五欄位運算式本身沒有時區欄位。

預先考量較短的月份

排在 29、30 或 31 日的每月工作,在沒有該日期的月份中不會執行。這是日曆事實,而非語法錯誤。如果工作必須每月執行,請選擇每個月都存在的日期;如果必須使用特定日期,請另外決定如何回報略過的執行作業。

確認可接受的語法

部分託管排程器接受六個或七個欄位、額外的秒數或年份、問號或廠商專屬延伸。這些格式可能看起來與傳統 cron 相似,但與標準五欄位運算式並不完全互通。請將產生器的輸出用於時間安排部分,然後確認目標接受該確切格式。除非目標文件明確要求,否則不要加入額外欄位或特殊符號。

將運算式轉為安全的排程工作

複製運算式後,請在目標 crontab 或排程器中加入命令。傳統 crontab 項目可能還需要使用者欄位,但產生的運算式不包含該欄位。環境變數、工作目錄與命令參數應放在排程器的工作定義中,而不是放在五個時間欄位內。對於傳統 Linux 工作流程,排程產生後,請遵循在 Linux 中建立 cron 工作的步驟。

請在非正式環境中測試完整項目,並觀察排程器的時區、記錄與實際執行時間。如果可能發生重試或重疊執行,請使用具冪等性的命令,讓重複執行不會造成不想要的重複效果。記錄失敗情況可讓您區分「工作未執行」與「工作已執行但失敗」。cron 運算式控制的是嘗試執行的時間;重試、鎖定、環境設定與監控仍需由周圍的系統處理。

若要深入了解,請參閱 Cron 解析器說明:欄位、規則與下次執行時間。