OpenClaw launchd:ThrottleInterval、KeepAlive 與健康探針——2026 租用 Mac mini 矩陣
在 VmMac 租用的 Apple Silicon Mac mini 上以 LaunchAgent 跑 OpenClaw 時,ThrottleInterval 可能掩蓋崩潰迴圈,KeepAlive 會把「中毒」程序一次次拉起,而 SuccessfulExit 的語義又常與 Node 閘道器在升級時的退出碼不一致。本文給出 2026 對照矩陣:安全組合、誤報重啟風暴、無頭健康探測,以及與香港、日本、韓國、新加坡、美國一致的觀測欄位。請同時閱讀 閘道器恢復、預釋出與生產隔離、結構化日誌與磁碟輪換,避免 plist 全靠猜。
基線路徑見 安裝與部署;訪問與賬號問題見 幫助;把金絲雀閘道器拆到獨立機器時參考 定價。
為什麼 launchd 策略比 Node 版本號更重要
即便 OpenClaw 語義化版本釘死,只要健康探針把 LLM 延遲誤判為宕機,launchd 仍可能每 12 秒 拉起一次閘道器。請把 plist 鍵當作 SLA 契約的一部分:它們定義作業系統如何理解成功、失敗與退避。在 VmMac 沒有虛擬機器監管器——launchd 就是監管器。
Node 閘道器還要遵守 macOS 訊號語義:部署時的 SIGTERM 必須關閉 HTTP 服務、刷出結構化日誌並在 launchd 升級到 SIGKILL 前退出。若程序因 WebSocket 懸掛而忽略 SIGTERM,你會看到互動 shell 裡「手動重啟永遠成功」,而代理自動化卻「飄忽」。把期望的訊號階梯寫進與 Node LTS 同級的 README,並先在可丟棄的 VmMac mini 上演練,再動生產 plist。
最後,ThrottleInterval 不是修 bug 的替代品——它只改變失敗尖叫的音量。請把 OS 級退避與應用級斷路器配對,避免一次壞配置在五地同時把 CPU 打滿。
- ThrottleInterval:限制重啟頻率,但可能掩蓋持續的部分不可用。
- KeepAlive:保持常駐,卻會讓有計劃的下線變複雜。
- ExitTimeOut:決定優雅退出視窗,超時後才會 SIGKILL。
矩陣:ThrottleInterval、KeepAlive、ExitTimeOut 的取捨
| 目標 | 主旋鈕 | 風險 | 緩解 |
|---|---|---|---|
| 阻止崩潰迴圈 | ThrottleInterval ≥ 30s | 真實崩潰後恢復變慢 | 與退出碼外部分頁配對 |
| 常駐閘道器 | KeepAlive true + SuccessfulExit false | 有意關機時仍被拉起 | 單獨維護用 Label |
| 優雅排空 | ExitTimeOut 25–40s | 卡死關機阻塞重啟 | 預算後看門狗 SIGKILL |
| 防止重啟驚群 | 錯開 StartCalendarInterval 或包裝器隨機 sleep | 就緒晚於同伴 | 健康門等待依賴而非牆鍾 |
當 OpenClaw 與使用者會話裡的其他 launchd 代理共存時,可在 plist 使用 Nice 與 LowPriorityIO,避免失控日誌船運餓死閘道器事件迴圈。它們不能替代容量規劃,但能在區域性事故中爭取幾分鐘——足夠 on-call 有意識地放寬 ThrottleInterval,而不是被誤報風暴牽著走。
誤報重啟風暴:症狀與根因
常見起點是健康檢查打 localhost 時閘道器仍在繫結套接字,而磁碟壓力拖長了模組載入。另一類是 Spotlight/mds 拉長冷啟動,觸發探針超時——請先對照 索引策略,再認定是 OpenClaw 自身問題。
另一類風暴來自依賴抖動:若探針先測外部 SaaS 再測本機就緒,日本或新加坡的路由抖動會把健康閘道器判死。請分層:外層監控先 loopback,再可選地以寬鬆超時取樣外部金絲雀,不要把程序生命週期綁在你無法掌控的第三方 SLA 上。
磁碟寫滿會造成殘酷假象:閘道器寫 JSONL 直到 APFS 返回 ENOSPC,非零退出,KeepAlive 立刻復活,日誌又立刻失敗——有時快過 ThrottleInterval 降溫。請把 日誌輪換與磁碟預算 的護欄對齊,讓重啟因正確原因變慢。
無頭健康探測:無需 VNC 的模式
用輕包裝器對閘道器健康埠執行 curl——僅在迴環上可關閉 TLS 校驗——更好的是呼叫 OpenClaw 自帶 CLI 狀態子命令(若版本提供)。記錄 HTTP 狀態、TLS 握手毫秒、以及探針後的 PID,讓值班區分「程序在但卡死」與「程序已退出」。
若可行,讓探針傳送合成 X-Probe-Trace-Id 頭並在閘道器日誌回顯,以便把探針失敗與程序內慢查詢縫合——這條關聯技巧比任何 plist 微調都更能終結 P1。
curl -fsS --max-time 3 http://127.0.0.1:18789/health || exit 1
2026 八步調參階梯
- 改 plist 前先採集 7 天基線退出碼。
- 把 ThrottleInterval 調到能消滅任何低於 20s 的重啟節奏。
- 讓 ExitTimeOut 與文件化的優雅關機 SLA 對齊。
- 為每次重啟寫入結構化日誌與原因碼。
- 先在一個 VmMac 區域跑 72 小時金絲雀。
- 對比 HK、JP、KR、SG、US 的重啟計數。
- 在 git 標籤
launchd-YYYYMMDD記錄可回滾 plist。 - 季度演練:
kill -9閘道器並度量恢復。
在步驟四與五之間,即使指標全綠也要把金絲雀 Label 的功能凍結 72 小時——許多風暴只在週末流量形態出現。視窗內抓取 sample 與 footprint,對比各地 VmMac 節點的記憶體迴歸。
與閘道器恢復手冊如何銜接
恢復類文章講該重啟什麼;本文講作業系統何時替你重啟。若數字不一致,人類會失去信任並開始習慣性 kill -9。請讓預釋出與生產使用相同數值旋鈕,參見 環境隔離,使晉升可 diff,而不是口口相傳。
可觀測性表:每次重啟要記什麼
| 欄位 | 用途 |
|---|---|
launchd_exit_status |
區分 OOM 與乾淨退出 |
uptime_s |
發現「短命」迴圈 |
rss_mb |
在 SIGKILL 前關聯洩漏 |
fds_open |
發現被 KeepAlive 放大的控制代碼洩漏 |
last_http_5xx_ts |
把上游 5xx 與本地死亡分開 |
請把這些欄位打成 JSON 行送到與閘道器請求相同的接收端,讓 SRE 從「launchd 重啟了作業」一鍵鑽取到「RSS 超過基線 1.2×」。欄位名在香港、日本、韓國、新加坡、美國保持一致,比第一版就追求完美基數更重要。
常見問題:Mac mini 上的 launchd 與 OpenClaw
要不要改成 LaunchDaemon? 僅在經過明確安全評審後——LaunchAgent 繼承的使用者 TCC 邊界可能是你有意依賴的。
能按區域不同調參嗎? 僅在有書面例外時;預設應保持一致。
升級 npm 依賴時呢? 遷移視窗臨時放寬 ThrottleInterval。
SuccessfulExit false 是否等於「任何退出都重啟」? 對多數閘道器實質如此——請用應用退出碼區分排空完成與崩潰,否則藍綠髮佈會與 launchd 打架。
健康探針應不應該用 root? 優先與網關同一使用者上下文,檔案許可權與鑰匙串/TCC 假設才能對齊;僅在只讀探針確有需要時再提權。
已知維護如何降噪? 讓包裝器檢查維護標記檔案再失敗探針,並給標記加自動過期,避免長假後被遺忘。
為什麼 Mac mini M4 與 VmMac 適合常駐閘道器
Mac mini M4 的持續效能足以吸收偶發冷啟動而不觸發過激探針,統一記憶體也能降低相比超賣 VPS 的 OOM 抖動。VmMac 讓你把閘道器放在香港、日本、韓國、新加坡、美國靠近使用者與合規要求的位置,再租第二臺 mini 專門做 plist 金絲雀,避免拿生產重啟語義做實驗。
租賃還縮短反饋環:當蘋果推送可能微妙改變 launchd 行為的 macOS 安全補丁時,你可以先在非生產 mini 快照 plist 矩陣、打補丁並重放同一健康探針指令碼,再觸碰面向客戶的自動化——這比一次深夜分頁便宜得多。