我造成的最嚴重的製作錯誤是 cron 表達式中的一個角色。我想要一個資料庫備份,每天晚上午夜運行。我寫了 0 0 * * * 在我的腦海裡,打字 0 0 * * 0 進入克朗塔布,然後繼續前進。這項工作運行了一次--接下來的周日--然後一周內就沒有再運行過。我發現了何時需要一個不存在的備份。那個錯位的數字變成了"每天&報價;進入&報價;每個週日,&報價;語法中沒有任何內容警告我。 Cron 永遠默默地執行你所說的內容。
TL;DR: 的 克朗表達式產生器 從普通欄位或一鍵預設建立標準的五字段 crontab 表達式,在鍵入時用句子解釋它,並在 UTC 中預覽下一次運行時間,以便您可以在達到生產之前確認時間表。它完全在您的瀏覽器中運行 - 無帳戶,無上傳。
我為 toolz。dev 建立了這個工具,因為我再也不想提交我只在腦海中檢查過的時間表。將 cron 表達式讀回簡單的英語並查看它將觸發的實際日期會捕獲 0 -對- * 立即犯錯類別。本指南涵蓋了 cron 語法的工作原理、幾乎讓每個人都陷入困境的交互,以及如何使用生成器產生您可以信任的表達式。
什麼是 cron 表達式?
cron 表達式是由五個由空格分隔的欄位組成的緊湊時間表。從左到右,它們是分鐘、小時、月中的日、月和一周中的日。五字段形式由 POSIX 在 中指定 crontab 條目格式。 調度程序 - 經典的 Unix cron daemon,還有 CI 系統、Kubernetes CronJobs 和無數的任務執行器 - 讀取表達式並在與所有欄位相符的每一刻觸發您的工作。
每個欄位接受多個數字。一顆星星(*) 意味著&引用;每一個&引用;該欄位的值。列表如 1,15,30 意味著幾個特定的值。範圍類似 1-5 意味著包容性的跨度。像這樣的步驟 */15 手段與報價;每十五次&報價;值從欄位開始'最小值。您將五個欄位中的這些內容結合起來來描述幾乎任何重複的時間表:每分鐘、每刻鐘、工作日上午8 點、每月第一個季度、最後一個季度和#39;開放日。功率是真實的,密度也是真實的 - 五個欄位可以編碼出奇精確的時間表,這正是它們很容易被巧妙地錯誤的原因。
這是生成器使用的欄位佈局,每個欄位的有效範圍:
| 位置 | 田野 | 範圍 | 筆記 |
|---|---|---|---|
| 1 | 分鐘 | 0.59 | |
| 2 | 小時 | 0 第23章 | 24小時制 |
| 3 | 月中的一天 | 1dom31 | |
| 4 | 月 | 1 分機12 | JAN相對DEC 也接受了 |
| 5 | 一周中的一天 | 0 點6分 | 0和7都是星期日的意思; SUN相對SAT 接受 |
為什麼要產生表達式而不是手動編寫它
手寫 cron 是一種賭注,您可以正確記住欄位順序、範圍和交互,直到作業運行或失敗為止不會得到任何回饋。生成器以確認替換該投注。當您填寫欄位時,它會同時執行三件事。
首先,它組裝並驗證表達式,捕捉超出範圍的值、反轉的範圍和格式錯誤的步驟,並顯示一條訊息,命名違規欄位。表達式就像 0 25 * * * - 第 25 小時不存在 - 被拒絕並做出解釋而不是被接受,並且默默地從不運行。
其次,它將時間表呈現為句子。 0 8 * * 1-5 成為&報價;週一至週五 08:00。&報價;用文字閱讀時間表是最快的方式,可以注意到你所建造的內容並不是你的意思。我讀到"的那一刻,我的午夜備份錯誤就很明顯了;週日 00:00 & 報價;而不是&報價; 00:00。&報價;
第三,它預覽了實際即將到來的運行時間。看到一項工作將在三個月內而不是今晚下次啟動,你會告訴你一些問題,這比盯著星號更發自內心。這個預覽還捕捉到了不可能的時間表 - 要求 2 月 30 日,生成器根本不會顯示即將到來的運行,因為沒有。
如何使用 Cron 表達式產生器
步驟 1:從預設或空白石板開始
達到正確表達式的最快路線是從已經接近的表達式開始。選擇像 " 這樣的預設;每週上午 8 點," & 引用;每 15 分鐘一次,& 引用;或&引用;每月第一個午夜,& 引用;欄位載入即可調整。如果沒有適合,則從每分鐘預設開始並編輯。預設的存在是因為大多數真實的時間表都是十幾種常見模式的變化,並且從已知的良好表達式開始可以消除一整類錯誤。
第 2 步:設定五個欄位
在每個欄位中輸入一個值,或將其保留為 * 對於&引用;每個。&引用;每個欄位接受一個值、一個逗號列表、一個連字符範圍或一個斜線步驟。例如,要在工作日工作時間每小時運行一次,請將分鐘設定為 0,小時到 9-17,以及一周中的某一天 1-5留下月份和月份的天數 *. 每個欄位下的提示提醒您其有效範圍,因此您不必記住訂單。
第三步:閱讀簡單的英文描述
鍵入時觀看描述更新。這是拯救您的步驟。如果句子與您頭腦中的時間表不匹配,則表達式是錯誤的,並且您在一周後在瀏覽器中而不是在生產中發現。按照您的意圖確認時間、日期和任何月份的限制。
第 4 步:檢查下一次運行並複製
點擊預覽即將到來的運行時間,以 UTC 計算。掃描它們是否有任何令人驚訝的內容 - 差距太長、第一次運行距離太遠或空列表表示不可能的日期。當時間表看起來正確時,複製表達式並將其貼到您的 crontab、管道或 CronJob 清單中。
月日陷阱和星期陷阱
如果你還記得關於 cron 的一件事,那就這樣吧,因為它第一次幾乎讓每個人都感到驚訝。什麼時候 兩者 月日欄位和星期日欄位受到限制 - 這意味著兩者都沒有 * - 標準 cron 將它們與 OR 結合,而不是 AND。作業運行時 要么 條件匹配。
所以 0 0 13 * 5 並不意味著&引用; 13號星期五午夜。&引用;它的意思是&引用;每個月 13 日午夜,每週五午夜。&引用;這些是非常不同的時間表;第二次每月會發射多次。這種行為直接來自大多數調度程序繼承的原始 Vixie cron 實現,生成器恰好尊重它。它的下一次運行預覽將向您顯示 13 日和周五,這是捕捉意外 OR 的最清晰的方式。
實際規則:將兩天欄位之一保留為 * 除非您真的想要 OR 行為。如果您確實需要"僅限 13 號星期五," cron 無法用一種表達方式表達它 - 您可以在工作中處理該邏輯。在預覽中看到實際運行日期是將其從潛伏的陷阱變成明顯、可見的事實的原因。
實踐中的步驟、範圍和清單
步驟語法是許多調度能力存在的地方,也是許多混亂開始的地方。 */5 分鐘欄位中的意思是分鐘 0、5、10、15 等到 55 - "每五分鐘。&引用;您可以將一個步驟錨定到一個範圍: 0-30/10 僅指第 0、10、20 和 30 分鐘。帶有步驟的裸值,例如 5/15 在分鐘欄位中,平均值&引用;從 5 開始,每 15 個&引用;最多欄位最大值 - 5、20、35、50。
列表和範圍自由組合。 1,4,7,10 在月份欄位中,您會得到一個季度時間表 - 一月、四月、七月、十月。 1-5 每週的一天會為您帶來週一至週五。 9-17 在小時欄位中,您會看到九到五個視窗。混合它們, 0 9-17 * * 1-5 讀作"週一至週五上午 9 點至下午 5 點每小時 0 分" - 常見的營業時間心跳。產生器擴展並驗證了所有這些,並且描述闡明了您構建的內容,因此對於範圍是否具有包容性(確實如此)沒有歧義。
常見用例
預定的備份和維護。 規範的 cron 作業。生成 0 2 * * * 對於每晚 2 點的備份,請閱讀說明以確認它是每日而不是每週,並預覽下一次運行以確保第一次運行是今晚。這正是我幾年前犯的錯誤,也是預覽所防止的錯誤。
CI 和部署時間表。 每晚建置、安排測試運行和定期部署都在 GitHub Actions、GitLab CI 和類似系統中使用 cron 語法。在此處建立表達式,確認它,並將其貼到工作流程檔案中。因為這些系統在自己的伺服器上運行,請注意下面的時區警告。
數據管道和報告。 每週一早上 6 點每週報告一次 0 6 * * 1;第一個是每月匯總 0 0 1 * *;季度工作是 0 0 1 1,4,7,10 *. 產生這些並讀回它們會停止經典的 "ran 在錯誤的日期"管道事件。
快取升溫和心跳。 高頻工作如 */5 * * * * 保持快取溫暖或健康檢查滴答作響。預覽確認間隔是您期望的,而不是因為您將步驟放在錯誤的欄位中而每小時一次。
學習克朗。 如果你仍在建立直覺,生成器就是一個教學工具。輸入表達式,閱讀句子,查看運行情況,語法和行為之間的映射就會變得具體,而文件本身無法管理。
關於時區的註釋
下一次運行的預覽在 UTC 中計算時間,因此結果是確定性的,並且對於每個閱讀此內容的人來說都是相同的。然而,實數 cron 守護程序在伺服器中運行'除非另有配置,否則 CI 提供者都有自己的約定 - 許多預設為 UTC,有些則不然。表達式本身不帶時區;由調度程序決定。因此,當您將表達式從此工具移至即時系統時,請確認系統'時區並相應地抵消您腦中的運行時間。 A 0 0 * * * 工作是午夜--但是午夜 在哪裡 完全取決於作業的運行位置。如果您需要推理時區偏移量,則 時區轉換器 很方便,而且 時間戳轉換器 當您的調度程序日誌以 Unix 時間戳記運行時,會有所幫助。
生成表達式與解析表達式
該工具從字段建立表達式。它的兄弟姊妹, 克朗表達式解析器,反之亦然:貼上現有的表達式,它會解釋它並預覽它的運行。兩者涵蓋了同一問題的兩個方向。當您知道您想要的時間表並需要語法時,請使用生成器;當您繼承了一個表達式並需要理解它的作用時,請使用解析器。兩者都遵循相同的 Vixie-cron 語義,包括月日或週日規則,因此您在一個中閱讀的描述與您在另一個中看到的行為相符。它們一起是我所描述的更廣泛的套件中的一對小型、集中的組合 web 開發人員工具包 概述和更廣泛 編碼工具指南.
隱私:這一切都在您的瀏覽器中運行
這裡沒有什麼可以上傳的,也沒有上傳什麼。該表達式完全是用客戶端程式碼建構、驗證、描述和模擬的。這比看起來更重要:內部作業時間表可以揭示有關係統的內容'您不希望坐在第三方中的架構和節奏'日誌。您可以透過斷開與互聯網的連接來確認該工具是獨立的 - 它繼續工作。這是 toolz。dev 上每個工具背後的相同客戶端原則,我在 中對此進行了詳細說明 線上工具中的資料隱私 文章。
問號
如何寫出 cron 表達式?
標準 cron 表達式有五個以空格分隔的欄位:分鐘、小時、月中的日、月和一週中的日。每個欄位都是一個特定值、一個清單、一個範圍、一個步驟或 * 對於每一個。例如, 0 8 * * 1-5 指週一至週五 08:00。此工具為您建立表達式並顯示其含義。
五克朗場是什麼意思?
從左到右分別是分鐘(0 °59)、小時(0 °23)、月日(1 °31)、月(1 °12)和星期一(0 °6,其中 0 和 7 均表示星期日)。欄位中的星號表示 "every"該欄位的值。該工具標記每個字段,以便您不必記住順序。
什麼 */5 意思是克朗?
斜線引入步長值。在分鐘欄位中, */5 手段&引用;每 5 分鐘&引用一次; - 0、5、10、15 等。您也可以將步驟與範圍組合: 0-30/10 分鐘欄位表示分鐘 0、10、20 和 30。步驟是表達和引用的標準方式;每個 N 個單位。&報價;
為什麼我的工作比預期的更頻繁地運行,月份和星期幾設定?
這是最常見的克朗驚喜。當月日和星期幾欄位都受到限制時(兩者都沒有) *),標準 cron 將它們視為 OR,而不是 AND - 當任一條件匹配時作業就會運行。所以 0 0 13 * 5 每月 13 日和每週五運行,而不僅僅是 13 日星期五。留下一塊字段作為 * 除非您真的想要 OR 行為。
下一個運行時間顯示在什麼時區?
預覽會計算 UTC 中即將運行的運行,因此每個人的結果都是相同的。 Real cron 守護程式使用伺服器時區(或 TZ 設定),因此如果您的伺服器在不同的區域運行,則相應地偏移時間。表達式本身不帶時區 - 由調度程序決定。
我可以使用像 mon 或 jan 這樣的名稱而不是數字嗎?
是的。月份欄位接受 JAN 通過 DEC 每週日欄位接受 SUN 通過 SAT,不區分大小寫。該工具在驗證和描述表達式時可以理解它們。數值在調度程序之間更便攜,因此生成器發出數字,但完全支援命名輸入。
這和 Crontab 語法一樣嗎?
是的,這會產生 crontab、大多數 CI 系統和 Kubernetes CronJobs 使用的標準五字段 Unix/Vixie cron。一些調度程序添加了第六秒字段或非標準擴展,例如 @reboot;這些不是五場標準的一部分。對於絕大多數調度需求,該工具產生的五場表達式正是您想要的。
我的行程表會寄到任何地方嗎?
不。該表達式完全在您的瀏覽器中使用客戶端程式碼進行建構、驗證、描述和模擬。沒有上傳或儲存任何內容。您可以透過斷開與互聯網的連接來確認這一點 - 生成器仍然工作。



