2026-04-28 租用無頭雲端 Mac(HK/JP/KR/SG/US)上的OpenClaw、launchd KeepAlive、結束碼、ThrottleInterval與重新啟動/崩潰迴圈排錯
多數OpenClaw正式環境安裝在Mac mini M4上僅暴露SSH,反向代理綁 127.0.0.1,JSON 紀錄可透過結構化日誌追蹤。若閘道程序由launchd管理,最終會碰到的失效模式往往不是「LLM 很玄」:而是結束後過快重新啟動——有時良性的(你要 launchd 一直跑),有時是災難級(設定錯、缺 PATH,或繫結前就崩潰)。本2026-04-28長文連結上游 HTTP 壓力與Webhook 背壓,落實於本機行程監督:KeepAlive與 ThrottleInterval如何互動;重新啟動雜訊下如何讀 StandardError的第一條失敗訊息;何時解除LaunchAgent以在互動 shell 重現。機密與環境見launchd 環境篇,升級與白名單見openclaw doctor+白名單。
無頭雲端 Mac 上,launchd 就是你的 init
與筆電不同,沒人盯著 Terminal 看npm或 openclaw gateway何時結束。穩健模式:裝在專用服務帳號,日誌進輪替檔案,讓 launchd掌握生命週期。2026年常見誤判是把 macOS 與 Linux systemd一一對應:KeepAlive、RunAtLoad功能強大但必須明確節流,否則能把 2 秒的錯字放大成每小時數千次 execve——塞滿 ~/Library/Logs與遠端日誌傳送器。請把程序結束當第一級訊號,而不是「又崩了聳肩」。
- 使用者 LaunchAgents —
~/Library/LaunchAgents承載每位使用者的長駐服務;多數 OpenClaw 為最小權限落在此。 - 系統 LaunchDaemons — 需管理員寫入、爆炸半徑更大;除非真需要 root 情境應避免。
KeepAlive:你開的是哪一種?
Apple 對 KeepAlive的 plist 可為布林,或帶條件(網路、路徑等)的字典。布林 true是大鎚:無論何種原因結束都重啟——適合預期 24/7 的網路守護行程,但放錯在一次性遷移。更細的:需網路或路徑存在。除錯「為何一直重啟?」先讀:是我要 launchd 維持存活,還是應用程式自己結束且 exit≠crash?在 KeepAlive true世界裡,乾淨的結束 0 仍會觸發重啟——正是包裝指令碼子程序分離錯誤時您看到的行為。
ThrottleInterval對齊到秒,監督器就是大鎚;若抖動沒有固定節奏,較像未處理的 Promise或埠競爭,而非模型本身。StandardOut/StandardError 路徑:用真實檔案
無頭SSH不是 TTY;stdio 連到「虛無」就會遺失崩潰前最初 200 ms。把 StandardOutPath與 StandardErrorPath指到服務使用者可寫的目錄,用 macOS newsyslog或每日 cron輪替,千萬不要依賴互動終端捲動。若與出站 TLS事件對照,同一時間戳對齊的 stdout、nginx存取與閘道 JSON 切片,勝過花俏儀表板。
ThrottleInterval:重新啟動的煞車
ThrottleInterval是 launchd主導重啟時,結束到允許再次拉起之間的最短等待秒數。初裝除錯可設10求日誌平靜;穩定後若希望暫態檔案鎖後快速恢復可用1–2。搭配:launchctl print gui/$(id -u)/com.example.openclaw(使用者網域,請改標籤)讀狀態與上次結束。寫進值班手冊:「若 Throttle=10,最壞約每 10 秒一次重啟」,以便被問到MTTR < 1 分鐘針對軟體而非基礎設施時能回答。
openclaw doctor可能在 launchd仍崩潰循環時通過——doctor 是短時互動二進位,擁有完整登入環境——您的 plist 可能漏了 node或全域 npm前綴的 PATH。務必把 env | sort與doctor 輸出做 diff。
工單裡實際會記錄的結束碼
| 結束/現象 | 常見 OpenClaw 原因 | 先做什麼 |
|---|---|---|
1(泛用)+ stderr 一條堆疊 | 設定解析、缺 OPENCLAW_變數或錯誤 cwd | 在 SSH 用相同 ProgramArguments執行,set -a; source your.env; set +a,見機密模式。 |
2(誤用)來自 shell 包裝 | 選項解析或 Mac 路徑引號 | 在包裝中記錄原始 argv,避免 glob;若要 arm64 請確認 Node 未跑 Rosetta(見SSH shell 設定)。 |
126/127 | 不可執行,或 plist PATH找不到 node | 二進位寫絕對路徑;在服務情境跑 which -a node。 |
| 信號 9/Linux 常說 137 — macOS 常是硬 kill | OOM、手動 kill 或(少見)看門狗 — M4 上同時看 LLM 與閘道記憶體 | 在 Console 看 memory pressure或依LLM 限流降併發。 |
崩潰迴圈排錯:改模型前先問六個問題
- 埠被占用?遊離閘道或殭屍監聽會導致 bind 失敗;見nginx 反向代理與埠對齊。
- 這是迴圈裡的 exit 0?包裝若 exit 0 卻未
exec進子程序,仍可能觸發KeepAlive。 - stderr 每次都一樣嗎?同一行決定性錯誤 → 設定;堆疊在變 → 競態或網路抖動。
- 上次改了什麼?綁 git tag 或
npmshrinkwrap;發布紀律文化對非 App Store 服務也有幫助。 - 上游 401 而重試停不下來?可能需要斷路器而非更大
KeepAlive壓力——429/503 見LLM 限流。 - 有沒有先節流大鎚?若沒有,第一反應常是先加
ThrottleInterval好讀日誌,再做真正修正。
log stream --style compact --predicate 'process == "openclaw"',否則雜訊會掩蓋您需要的第一行訊號。Plist 維運清單(可貼進 Confluence/Notion)
- Label — 唯一反向 DNS;同一
UID勿重複他人com.前綴。 - ProgramArguments[0] — 完整路徑;別賭登入 shell 驚喜。
- WorkingDirectory — 儲存庫根,相對設定路徑須符合
openclaw doctor假設。 - EnvironmentVariables —
HOME、PATH、(必要時)NODE_OPTIONS— 與機密文件對齊。 - KeepAlive + ThrottleInterval — stderr 很小且無輪替時勿同時設激進重新啟動。
plutil -lint ~/Library/LaunchAgents/com.yourorg.openclaw.plist
launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/com.yourorg.openclaw.plist
告警「新加坡 OpenClaw 掛了」時的七步
- 檢視邊緣健全性(nginx)— 502 對 504 區分上游與閘道;出站失敗再查DNS/TLS。
- 檢視 launchd 狀態 —
launchctl print標籤;讀上次結束與節流視窗。 - 穩定日誌 — 仍抖動就調
ThrottleInterval。 - 在同一
UID、無 launchd下互動複現。 - 設定 diff與機密輪換雙人覆核。
- Roll forward到已知良好的
npm版本,而非正式環境的神秘修補。 - 事件後 — 工單一小段:根因、偵測缺口、護欄(例如 1 分鐘內非零結束警示)。
常見問題:launchd 與 OpenClaw 閘道本身
| 問題 | 2026-04-28 回覆 |
|---|---|
要把 ProcessType設成 Interactive 嗎? | 伺服守護程式通常不要;Interactive 改排程優先順序。除非 Apple 文件針對您的 macOS build 另有建議,否則用標準背景行為。 |
需要 caffeinate嗎? | 機房內24/7租用的 Mac mini M4通常在電源政策層停用睡眠;若為筆電式主機(非 MacXCode 情境),真正錯誤若在喚醒崩潰,也不該靠 caffeinate硬擋。 |
為何 Apple Silicon Mac mini M4 仍在本手冊裡
launchd的誠實度取決於底層硬體。裸機 Mac mini M4(香港、東京、首爾、新加坡、美國,1–2 TB,CPU 排程可預期)讓「是否因工具呼叫太多把閘道 OOM?」成為可量化問題而不是感覺。同一套適合本機 ML 實驗的 MPS 核心也留空間給結構化日誌轉送、反向代理與 OpenClaw 堆疊,因此團隊會把這些文章與區域節點定價及接入說明一起讀,當他們已超出綁在單一人身上的筆電規模時。