開發者工具 · Crontab 產生器
重疊的 cron 作業:為什麼長任務需要叢集以及如何新增它
· 為什麼它很重要
規劃任務 並發 操作
Cron 會依照計畫啟動作業,無論上一次執行是否已完成。這篇文章解釋了為什麼這會導致損壞和負載峰值,並展示了使執行獨佔的羊群習慣用法。
兩個導入寫入同一個表 - 每小時作業慢於一個小時,並 cron 不斷啟動新副本
每小時表達式可以在與較早候選者相關的工作仍在執行時識別新候選者。 `0 * * * *` 中沒有任何內容記錄持續時間、進程標識或完成狀態。 ToolAcre 每小時擴展零分鐘,並可以列出未來時間,但它從不觀察這些時間之間的操作。
這意味著必須單獨審查頻率和排他性。如果任務可以超過其間隔,請先量化目標系統上的持續時間。然後選擇那裡支援的並發控制。編輯正確的計劃本身並不能增加現有流程的知識或阻止第二次呼叫。
表達式不包含正在執行的作業狀態
解析器在呼叫之間是無狀態的。它將文字轉換為排序值陣列和警告,而 `nextRuns` 在沒有進程表的情況下搜尋日期。 UI 根據目前運算式重新計算,且不保留作業生命週期。它的模型詢問先前的動作何時保持活躍,而不是詢問是否保持活躍。
這是文章標題背後的精確證據。它不需要關於每個 cron 守護程序如何分叉或排隊的宣告。表達式語言本身缺少重疊欄位,且產生器缺少執行時監視器。任何排他性保證都必須來自一個單獨的層,其行為經過獨立測試。
可能的重疊症狀取決於命令,且產生器無法預測
重疊可能與重複工作、鎖定爭用或負載有關,但這些結果取決於指令的作用。即使在相同的小時計劃下,只讀冪等檢查和有狀態導入也具有不同的風險。 ToolAcre 沒有命令解析器、資料庫連線或資源模型來預測它們。
記錄操作的並發屬性,而不是將通用故障預測附加到表達式。測量正常和最差觀察到的持續時間,識別共享狀態並確定跳過或延遲執行的含義。這些運營事實決定了排他性是否必要;這五個欄位僅確定候選時間。
羊群語法和行為在此儲存庫之外
工作簿規定了 `flock -n`、鎖定路徑和退出行為。此儲存庫中沒有出現叢集實作或測試,因此此模組不驗證該語法。平台可用性、檔案系統權限和鎖定生命週期都位於瀏覽器的調度代碼之外。
如果叢集適用於目標,請使用其安裝的檔案並在那裡測試無害的爭用場景。不要因為前綴計時欄位透過 ToolAcre 就推斷成功。有效的表達式可以位於無效的鎖定命令之前,就像正確的鎖定可以保護為另一種方言編寫的調度一樣。
工作邊界:驗證每小時計時而不宣告鎖定語意
使用 `0 * * * *` 作為工作時間表。描述說每小時過零分,預覽應該在開始時刻之後前進到連續的小時邊界。這證明了 ToolAcre 計算的節奏。它並不能證明當命令的持續時間跨越這些邊界之一時會發生什麼。
將每小時的期望帶入目標端並發測試。啟動一個無害的長時間執行實例,到達下一個候選實例並觀察所選的控制。將結果作為執行證據與表達式審查分開。如果計時或鎖定稍後發生變化,這可以保留清晰的診斷。
替代排他性機制需要特定目標的證據
腳本內部的鎖定、主管策略和服務管理器行為都可能提供排他性,但無法從此來源對它們的語意進行排序。 ToolAcre 也不知道錯過一次執行是否可以接受,工作是否應該排隊,或者是否應該退出第二次嘗試。
在選擇機制之前定義這些結果。 「絕不重疊」只是一項政策;其他還有合併、排隊和與分區狀態的並行性。產生器可以提供政策討論中使用的候選節奏,而實現選擇仍然基於實際執行時間。
分散式鎖定仍處於計劃解析和預覽之外
跨主機共享的鎖定引入了本地日曆計算之外的協調。解析器中不會出現主機身分、網路儲存或租約。因此,本文避免建議本地檔案或瀏覽器預覽解決分散式並發問題。
對於多主機工作,請使用協調設計,其故障模式、所有權和恢復行為均已記錄和測試。將五場時間表保留為該系統的一項輸入。表達式可以完美地移植,而排他性層則與環境密切相關。
重點:日程安排和排他性是不同的問題-產生器處理第一個問題,flock 處理第二個問題
當另一次嘗試符合條件時安排答案;排他性回答了是否可以開始。 ToolAcre透過欄位擴充和掛鐘預覽僅實現了前者。它缺乏進程狀態是一個架構邊界,而不是一個隱藏的預設值。
建構並驗證節奏,測量操作持續時間,然後測試目標支援的並發策略。將這些作為單獨的控制項進行報表可以使兩者都可以進行審查。產生器不會調度作業,複製的表達式永遠不應該被描述為防止重疊執行。