Gateway

重新啟動復原

重新啟動閘道不會遺失代理程式狀態。對話、逐字記錄、排程工作、背景任務記錄和排隊中的外送訊息全都儲存在磁碟上,而在回合進行途中中斷的工作會在閘道重新啟動後被偵測並自動恢復。不需要手動介入,也沒有任何需要設定的項目:復原功能一律啟用。

本頁說明哪些內容會在重新啟動後保留、如何偵測中斷的工作,以及自動恢復的運作方式。

重新啟動後會保留的內容

狀態 儲存位置 重新啟動時的行為
對話歷史記錄 JSONL 逐字記錄 + 磁碟上的各代理程式工作階段儲存區 不受影響;工作階段會從儲存的逐字記錄繼續
中斷的主要工作階段回合 工作階段儲存區中的復原標記 啟動幾秒後自動恢復
子代理程式執行 SQLite(共用狀態資料庫) 啟動時還原登錄檔;恢復中斷的執行
背景任務 SQLite(共用狀態資料庫) 啟動時進行調整;復原孤立的執行或將其標記為遺失
排隊中的外送作業 SQLite 傳遞佇列 重新啟動後清空佇列;重試尚未送達的回覆
已排程(排程)工作 SQLite 排程儲存區 排程會持續保留;排程器會在啟動時重新啟用
重新啟動接續作業 SQLite 重新啟動哨兵 向要求重新啟動的工作階段分派一次性後續作業

正常重新啟動會先等待工作完成

要求重新啟動(openclaw gateway restart、需要重新啟動的設定變更或閘道更新)時,不會立即終止進行中的工作。閘道會停止接受新工作,然後等待使用中的代理程式回合和背景任務完成,最長不超過排空時限(預設為 5 分鐘)。因此,大多數重新啟動完全不會中斷任何工作。

只有無法在排空時限內完成的工作(或被強制重新啟動或當機中斷的任何執行)才會被中止,而在此之前,每個受影響的工作階段都會標記為待復原。

如何偵測中斷的工作

系統會使用兩種互補的機制,標記回合尚未完成的工作階段:

  • **關閉時:**在重新啟動的排空期間,任何有執行中工作的工作階段都會先在工作階段儲存區中加上復原標記,然後才中止該工作。
  • **啟動時:**閘道會掃描工作階段儲存區,找出仍宣稱正在執行,但在新程序中沒有有效擁有者的工作階段。這可涵蓋未執行任何關閉程式碼的嚴重當機和程序終止。同時也會清除過時的逐字記錄鎖定檔案。

自動恢復

啟動幾秒後,閘道會重新分派每個已標記的工作階段,並附上合成的系統訊息,告知代理程式先前的回合因重新啟動而中斷,並要求它從現有逐字記錄繼續。如果最終回覆已經產生但尚未送達,也會一併包含其文字,讓代理程式直接傳送,而不是重新執行工作。復原最多重試 3 次,並採用指數退避。

在恢復之前,閘道會檢查逐字記錄的結尾是否能安全接續。如果不安全(例如,回合結束於過時的待核准狀態),系統不會盲目重新執行工作階段;代理程式會改為發布簡短通知,要求使用者重新傳送上一個要求。

OpenClaw 也能重建中斷的唯讀 Code Mode 工作。Code Mode 會將這些執行標記為重新啟動安全,並在具有副作用的目錄工具或外掛命名空間執行前加以拒絕。如果重新啟動發生在 wait 控制項上,新閘道會根據逐字記錄重建該回合,並強制重建後的執行維持重新啟動安全,即使模型省略或清除該旗標也是如此。主機會將整個重建回合限制為經稽核的唯讀核心工具和明確可安全重播的外掛工具,即使重新啟動後已停用 Code Mode 也一樣。具有副作用的工作仍由重新傳送通知保護,以免冒著重複寫入的風險。

子代理程式

子代理程式執行會持久儲存在共用 SQLite 狀態資料庫中,因此子代理程式登錄檔可跨程序保留。啟動時會還原登錄檔,並使用原始任務內容恢復中斷的子代理程式工作階段。系統設有兩項安全機制:

  • 超過 2 小時前中斷的執行會直接完成,而不是恢復,因此停機一整夜的閘道不會重新啟動過時的工作。
  • 反覆復原失敗的工作階段會被設為墓碑,標記為卡死,避免復原無限循環。

背景任務

背景任務登錄檔 以 SQLite 為後端,並會在啟動時及定期進行調整:已完成執行所記錄的持久結果會被復原,而擁有程序已消失的執行則會在寬限期後標記為遺失,而不是永遠停滯。

代理程式要求的重新啟動

當代理程式本身觸發重新啟動(套用設定變更、更新閘道或明確要求重新啟動)時,系統會在程序結束前將重新啟動哨兵寫入 SQLite。啟動後,閘道會將結果傳回原始聊天,並分派一次性的接續回合,讓代理程式從完全相同的位置繼續,並沿用相同的頻道和討論串。

安全機制與可觀測性

  • **當機循環斷路器:**在 5 分鐘內發生 3 次未正常關閉的啟動,會觸發斷路器,在下次啟動時抑制自動啟動的附屬服務,避免持續當機的閘道加劇問題。當未正常啟動的時間窗口結束後,便會恢復。
  • **指標:**復原活動會透過 Prometheus 匯出為 openclaw_session_recovery_totalopenclaw_session_recovery_age_seconds
  • **記錄:**復原決策會記錄在 main-session-restart-recoverysubagent-interrupted-resume 子系統下。

不會恢復的內容

  • 因已有其他擁有者處理而排除於主要工作階段復原之外的工作階段:子代理程式工作階段(由子代理程式復原處理)、排程工作階段(排程器會依排程重新執行),以及由 ACP 管理的工作階段(由已連線的 IDE 或用戶端負責恢復)。
  • 逐字記錄結尾無法安全接續的工作階段;這類工作階段會收到上述重新傳送通知,而不會在未告知的情況下重新執行。
  • 從未獲准進入系統的工作:在排空期間抵達的訊息會收到明確的重新啟動錯誤並被拒絕,而不會悄悄排入即將終止的程序。
Was this useful?
On this page

On this page