繁體中文

開發者工具 · Crontab 產生器

cron 中的一個月中的某一天與一周中的某一天:令所有人驚訝的 OR 規則

· 工作原理

規劃任務 日曆 調度

兩個日曆過濾器透過「或」閘連接到一個計劃中
原始 ToolAcre 向量圖

當兩個日期欄位都受到限制時,如果其中一個欄位匹配,則 cron 會執行該作業。這篇文章解釋了 crontab(5) 的規則、它存在的原因以及如何取得它阻止的計劃。

此報告於 1 日和每週一發布 — 表達式 0 9 1 * 1 並不意味著它看起來的樣子

諸如 `0 9 1 * 1` 之類的表達式看起來像「09:00 on the first Monday」。 ToolAcre 並不是這樣解讀的。將月份中的某一天設為 1 並將星期幾設為星期一時,解析器會警告任一條件都可以匹配,因此計劃包括每個第一個和每個星期一。

這不是一個次要的措詞偏好。月度報告可以額外執行四到五次,預計僅在星期一進行的操作也可以在每月的第一天執行。產生器在描述旁邊放置了一個「值得檢查」警告,以便在將表達式複製到外部 crontab 之前擴展的行為是可見的。

所寫規則 — 如果月份中的某一天和星期幾都受到限制,則當任一欄位匹配時執行該命令

實現的 `dayMatches` 函數明確處理四種情況。兩個通配符接受每個日期;通配符月份日期推遲到工作日;通配符工作日遵循月份中的某一天;兩個受限欄位返回其匹配項的邏輯或。測試涵蓋僅與第 13 日、僅與星期五匹配的日期,以及與這兩個條件都不匹配的日期。

描述保留相同的規則。 `0 0 13 * 5` 呈現為“on the 13th of the Month or on Friday”,而不是一個含糊的連接詞。解析、下次運算選擇和英文輸出都使用相同的解釋。這種共同的行為比孤立的幫助標籤是更有力的證據,因為這些路徑之間的分歧會立即產生誤導性的預覽。

解析器實作 OR 並公開結果;它沒有建立規則的歷史

工作簿大綱提供了 OR 設計的歷史原因,但此儲存庫證明了行為而不是來源。程式碼註解標識 Vixie 風格的規則,測試建立由 ToolAcre 建模的結果。他們沒有記錄誰選擇了該規則、該規則何時被採用或為什麼傾向於寬容的解釋。

在技術寫作中保持該邊界很重要。讀者需要確切地知道這個工具是如何擴展表達式的;他們不需要發明標準敘述來安全地使用它。如果部署目標記錄了不同日期的語義,則其自己的手冊的排名優於此瀏覽器預覽。 ToolAcre 宣告了它計算的方言,而不是聲稱每個調度程序都同意。

工作範例:枚舉 0 9 1 * 1 一個月 - 與作者想要的時間表相比,它觸發的天數

考慮第一天不是星期一的一個月。 `0 9 1 * 1` 在第一次執行時產生一次執行,並在每週一產生附加執行。如果第一個本身是星期一,則該日期仍會出現一次,因為下次執行搜尋考慮一個日曆分鐘,而不是兩個單獨的觸發器。並集的大小隨日曆而變化,但邏輯上不變。

您可以透過選擇時區並讀取接下來的五次執行來檢查該聯合。預覽嚴格在當前時刻之後開始,並搜尋日曆日期,應用月、日和時間欄位。它不承諾文章散文中的特定月份,因為即時清單取決於讀者執行檢查的時間和地點。

AND 風格的第一個星期一命令解決方法不在該計劃產生器之內

該計劃建議嵌入 shell 日期測試以獲得 AND 行為。 ToolAcre 無法驗證這樣的命令:它只接受五個計劃字段,並且其複製的整行包含佔位符可執行檔。 Shell 語法、百分比轉義、命令可用性和退出行為都屬於最終運行作業的環境。

在此生成器中,安全的設計舉措是將一天欄位保留為 `*` ,除非真正想要使用 OR 並集。對於第一個星期一的要求,記錄五個欄位 cron 單獨不能表達此方言中的交集。單獨選擇並測試特定於環境的解決方案,而不是按保證提供未執行的程式碼片段。

此五欄位解析器不解釋其他調度程序運算符

某些調度程序語法公開諸如 `#`、`L`、`W` 或 `?` 之類的運算符,但此解析器不接受其中任何一個。它還拒絕六個欄位,並解釋說它的合約是五欄位 crontab 語法。因此,無法將适用于其他產品的表達式粘贴到此處作為存在相同日歷规則的證據。

方言翻譯首先是識別來源語法和目標語法,而不是刪除標點符號,直到驗證成功。 ToolAcre 可以幫助建立目標的五個普通欄位、名稱、範圍、清單和步驟。它無法保留不受支援的運算子所攜帶的語義,並且文章故意避免將這些外部運算符描述為就好像它們已實現一樣。

指令轉義超出了僅表達式語法

百分號和命令引用出現在時間表之後,並位於 `parseCron` 之外。解析器將一個表達式拆分為五個空格分隔的部分;它從不讀取 shell 管道、日期命令或轉義命令負載。因此,儘管工作手冊提出了百分號解決方法,但本文並未給出解決方法。

該遺漏是正確的決定。調度工具不應因為其計時欄位有效而暗示命令是安全的。檢查實際 cron 實作和 shell 中的命令語法,以及無害的輸入和可觀察的輸出。使產生器的結果範圍保持在它明顯理解的日曆規則範圍內。

要點:限制一天欄位,而不是兩者 - 並產生器的解釋使 OR 在保存行之前可見

當兩個日期欄位都受到限制時,將它們作為並集讀出並大聲說「或」。更好的是,檢查發電機的警告和即將到來的運作。如果這些日期超出預期設置,則將欄位傳回 `*` 並使用目標環境記錄的機制解決任何更特殊的要求。

核心教訓不是 cron 很神秘;而是 cron 很神秘。它是兩個相鄰的列不像其他限制那樣組合。 ToolAcre 將異常集中在解析、描述和預覽邏輯中。在表達式離開瀏覽器並成為操作計劃之前,請使用這三個視圖來捕獲不匹配的情況。