cron 解析器是一種用於驗證及解譯傳統五欄位 cron 運算式的工具:分鐘、小時、每月日期、月份及每週星期幾。cron 運算式相當精簡,但這種精簡特性可能掩蓋欄位位置錯誤,或某個日期規則的行為與一般日曆篩選器不同。Cron Parser 會檢查運算式是否恰好包含五個欄位、驗證每個欄位,並將精簡notation轉換為標準化運算式及逐欄位摘要。它接受數值、星號萬用字元、以逗號分隔的清單、含首尾端點的範圍,以及套用於萬用字元或範圍的正數步長。完成驗證後,它會計算接下來五個符合條件的時間點,並以瀏覽器的本地時間搭配 ISO UTC 時間戳顯示。因此,在將排程複製到 crontab 檔案或其他排程服務之前,這項工具可用於檢查排程,同時維持一項重要區別:運算式通過驗證,並不代表每個排程器都會以相同方式解讀相同的語法、日期規則或時區。

cron parser explained
Cron Parser 解析指南:欄位、規則與下次執行時間

依序排列的五個欄位

請由左至右閱讀傳統 cron 運算式。每個位置都控制日曆中的一個部分,因此將值放錯欄位,可能使每小時執行的任務變成每日執行。Cron Parser 會依照 Cronie 風格 crontab 檔案所使用的慣用範圍檢查每個值:

欄位範圍選取內容
分鐘0-59每小時內的分鐘
小時0-23每天的小時
每月日期1-31月份中的日期數
月份1-12日曆月份數
每週星期幾0-7星期幾;0 和 7 都代表星期日

運算式必須恰好包含五個以空格分隔的欄位。額外的命令文字會被拒絕,因為此解析器檢查的是排程運算式,而非完整的 crontab 行。日曆有效性由 JavaScript Date 處理:31 日規則自然會略過沒有 31 日的月份,而二月規則會遵循閏年。

驗證並說明排程

請將解析器用作逐欄位檢查,而非單一通過或失敗的測試。這個工作流程涵蓋完整運算式,以及決定其執行時間的各項假設。

  1. 輸入恰好五個欄位。依序放入分鐘、小時、每月日期、月份及每週星期幾的值。不要加入秒數欄位、年份欄位、命令或其他尾端內容。
  2. 在每個欄位中使用支援的數值語法。輸入數字、星號萬用字元、以逗號分隔的清單、含首尾端點的數值範圍,或套用於萬用字元或範圍的正數步長。清單可以混合使用個別值與範圍。
  3. 閱讀全部三種形式的輸出。檢視標準化運算式、各欄位選取內容的摘要,以及以本地時間和 UTC 顯示的接下來五個符合條件的時間。摘要會說明規則,而執行預覽則顯示實際符合條件的頻率。
  4. 確認執行環境。將結果與將執行該工作的排程器文件及其設定的時區進行比較。部署前,也應檢查其日光節約時間政策及日期欄位行為。

解讀標準化運算式與執行預覽

標準化作業會移除多餘空格,並將星期幾 7 改為星期日值 0,使運算式更容易檢視。欄位摘要隨後會將每個位置轉換為所選的值,而預覽則提供接下來五個符合條件的日期時間點。請考慮以下完整排程:

15 8-12/2 * * 1-5

  • 分鐘欄位會選取第 15 分。
  • 小時範圍與步長會選取 8、10 和 12 小時。
  • 每月日期與月份欄位皆為萬用字元。
  • 每週星期幾範圍會選取星期一至星期五。

由於每月日期是萬用字元,因此符合條件的控制因素在於受限制的星期幾欄位。所以摘要會說明在工作日 08:15、10:15 和 12:15 符合條件。執行預覽會列出接下來五個符合條件的日期時間點,並同時顯示瀏覽器的本地時間與 ISO UTC 時間戳,以便跨系統比較。候選分鐘會以整分鐘為單位向前掃描,而日曆日期則會依每個月份的實際長度判定。

為何兩個日期欄位需要特別注意

傳統 cron 在兩個日期欄位都受到限制時會採用 OR 規則。如果每月日期限制為 21 日,而每週星期幾限制為星期一,則符合條件的時間可能出現在每個星期一以及 21 日。排程並不要求兩個日期欄位同時符合。分鐘、小時及月份欄位仍必須正常符合。

當其中一個日期欄位為萬用字元時,則由受限制的欄位控制是否符合條件。因此,萬用字元每月日期搭配星期一至星期五時,其行為等同於工作日篩選器。這與一般人預期一般多條件日曆規則所具有的 AND 關係不同。

Cron Parser 遵循有文件記載的傳統 OR 行為,也會在計算即將到來的時間時一致套用這項規則。正式環境中的排程器可能會定義相關擴充功能或差異,因此應確認其文件,不要假設每個環境都遵循相同的日期語意。

本地時間、UTC 與日光節約時間的呈現方式

下次執行引擎會將候選分鐘列舉為 UTC 時間點,再將結果格式化給檢視者。內部採用 UTC 可讓計算具決定性,並避免掃描期間因日光節約時間而跳動。輸出會提供相同即將到來時間點的兩種檢視:便於閱讀的瀏覽器本地時間,以及供系統比較的 ISO UTC 時間戳。

瀏覽器的時區不等於排程器的時區。解析器既不會設定正式環境中的排程器,也不會變更其行為,因此顯示的本地時間可能不是已部署工作的實際執行時間。請將兩個欄位與排程器設定進行比較。如果排程跨越日光節約時間轉換時段,受影響的掛鐘時間如何處理,將由排程器自身的政策決定。

支援的語法與刻意設定的界限

Cron Parser 以傳統 crontab 語法中可攜的數值核心為目標。它接受及拒絕的形式皆明確界定如下:

建構形式狀態詳細資訊
數值接受必須落在其欄位的慣用範圍內
星號萬用字元接受選取該欄位中所有可用值
以逗號分隔的清單接受可以混合使用個別值與範圍
含首尾端點的數值範圍接受包含起始值與結束值
正數步長接受必須套用於萬用字元或含首尾端點的範圍
JAN 或 MON 等名稱不接受月份與星期幾的值必須為數值
@daily 等暱稱不接受請改用五欄位運算式
秒數或年份欄位不接受支援的格式恰好包含五個欄位
Quartz 問號、每月最後一天語法、雜湊排程、隨機範圍及供應商巨集不接受這些屬於其他 cron 方言或擴充功能

遞減範圍、零步長、清單中的空白項目,以及超出適用欄位範圍的值,都會以明確且聚焦的錯誤訊息拒絕。非五個欄位的運算式也會被拒絕,包括額外的命令文字。這種嚴格範圍可避免將不受支援的方言功能呈現為可攜的 cron 行為。

這項區別十分重要,因為 Cronie、Vixie cron、systemd timers、Kubernetes、Quartz、雲端排程器及 CI 服務並非全都接受相同的欄位或擴充功能。將五欄位運算式放入預期使用六或七個欄位的服務中,可能代表完全不同的意義,或直接遭到拒絕。請一律遵循部署環境的排程器文件。

確認將執行運算式的排程器行為

傳統 cron 參考資料,例如 Cronie crontab(5) 原始碼及Oracle Linux cron 指南,有助於確立傳統規則,但無法取代將執行您工作的服務文件。

  • 確認目的地預期使用傳統數值五欄位運算式,且不要求秒數、年份、別名或供應商擴充功能。
  • 驗證排程器設定的時區及其日光節約時間轉換政策。
  • 確認當兩個日期欄位都受到限制時,排程器會採用傳統 OR 關係。
  • 檢視接下來五個符合條件的時間,確認其頻率符合預期。如果在五年掃描界限內找不到五個符合條件的時間,計算就會停止,因此極為稀疏的規則可能無法產生完整預覽。
  • 將解析器用作關鍵備份、計費、通知或維護工作的驗證輔助工具。它不會執行命令、連線至伺服器或儲存運算式。