AI/自動化 2026年4月28日

2026-04-28 租用無頭雲端 Mac(HK/JP/KR/SG/US)上的OpenClawlaunchd KeepAlive結束碼ThrottleInterval重新啟動/崩潰迴圈排錯

MacXCode 技術團隊 2026年4月28日 約 20 分鐘閱讀

多數OpenClaw正式環境安裝在Mac mini M4上僅暴露SSH,反向代理綁 127.0.0.1,JSON 紀錄可透過結構化日誌追蹤。若閘道程序由launchd管理,最終會碰到的失效模式往往不是「LLM 很玄」:而是結束後過快重新啟動——有時良性的(你要 launchd 一直跑),有時是災難級(設定錯、缺 PATH,或繫結前就崩潰)。本2026-04-28長文連結上游 HTTP 壓力Webhook 背壓,落實於本機行程監督:KeepAliveThrottleInterval如何互動;重新啟動雜訊下如何讀 StandardError第一條失敗訊息;何時解除LaunchAgent以在互動 shell 重現。機密與環境見launchd 環境篇,升級與白名單見openclaw doctor+白名單

無頭雲端 Mac 上,launchd 就是你的 init

與筆電不同,沒人盯著 Terminal 看npmopenclaw gateway何時結束。穩健模式:裝在專用服務帳號,日誌進輪替檔案,讓 launchd掌握生命週期。2026年常見誤判是把 macOS 與 Linux systemd一一對應:KeepAliveRunAtLoad功能強大但必須明確節流,否則能把 2 秒的錯字放大成每小時數千次 execve——塞滿 ~/Library/Logs與遠端日誌傳送器。請把程序結束當第一級訊號,而不是「又崩了聳肩」。

  • 使用者 LaunchAgents~/Library/LaunchAgents承載每位使用者的長駐服務;多數 OpenClaw 為最小權限落在此。
  • 系統 LaunchDaemons — 需管理員寫入、爆炸半徑更大;除非真需要 root 情境應避免。

KeepAlive:你開的是哪一種?

Apple 對 KeepAlive的 plist 可為布林,或帶條件(網路、路徑等)的字典。布林 true是大鎚:無論何種原因結束都重啟——適合預期 24/7 的網路守護行程,但放錯在一次性遷移。更細的:需網路或路徑存在。除錯「為何一直重啟?」先讀:是我要 launchd 維持存活,還是應用程式自己結束且 exit≠crash?KeepAlive true世界裡,乾淨的結束 0 仍會觸發重啟——正是包裝指令碼子程序分離錯誤時您看到的行為。

啟發式(2026-04-28):若服務重啟間隔與您的 ThrottleInterval對齊到,監督器就是大鎚;若抖動沒有固定節奏,較像未處理的 Promise或埠競爭,而非模型本身。

StandardOut/StandardError 路徑:用真實檔案

無頭SSH不是 TTY;stdio 連到「虛無」就會遺失崩潰前最初 200 ms。把 StandardOutPathStandardErrorPath指到服務使用者可寫的目錄,用 macOS newsyslog或每日 cron輪替,千萬不要依賴互動終端捲動。若與出站 TLS事件對照,同一時間戳對齊的 stdoutnginx存取與閘道 JSON 切片,勝過花俏儀表板。

ThrottleInterval:重新啟動的煞車

ThrottleIntervallaunchd主導重啟時,結束到允許再次拉起之間的最短等待秒數。初裝除錯可設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 | sortdoctor 輸出做 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 設定)。
126127不可執行,或 plist PATH找不到 node二進位寫絕對路徑;在服務情境跑 which -a node
信號 9/Linux 常說 137 — macOS 常是硬 killOOM、手動 kill 或(少見)看門狗 — M4 上同時看 LLM 與閘道記憶體在 Console 看 memory pressure或依LLM 限流降併發。

崩潰迴圈排錯:改模型前先問六個問題

  1. 埠被占用?遊離閘道或殭屍監聽會導致 bind 失敗;見nginx 反向代理與埠對齊。
  2. 這是迴圈裡的 exit 0?包裝若 exit 0 卻未 exec進子程序,仍可能觸發 KeepAlive
  3. stderr 每次都一樣嗎?同一行決定性錯誤 → 設定;堆疊在變 → 競態或網路抖動。
  4. 上次改了什麼?綁 git tag 或 npm shrinkwrap;發布紀律文化對非 App Store 服務也有幫助。
  5. 上游 401 而重試停不下來?可能需要斷路器而非更大 KeepAlive壓力——429/503 見LLM 限流
  6. 有沒有先節流大鎚?若沒有,第一反應常是先加 ThrottleInterval好讀日誌,再做真正修正。
日誌衛生:崩潰迴圈中,僅在把重新啟動速率降下來後再用 log stream --style compact --predicate 'process == "openclaw"',否則雜訊會掩蓋您需要的第一行訊號。

Plist 維運清單(可貼進 Confluence/Notion)

  • Label — 唯一反向 DNS;同一 UID勿重複他人 com.前綴。
  • ProgramArguments[0] — 完整路徑;別賭登入 shell 驚喜。
  • WorkingDirectory — 儲存庫根,相對設定路徑須符合 openclaw doctor假設。
  • EnvironmentVariablesHOMEPATH、(必要時)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 掛了」時的七步

  1. 檢視邊緣健全性(nginx)— 502 對 504 區分上游與閘道;出站失敗再查DNS/TLS
  2. 檢視 launchd 狀態launchctl print標籤;讀上次結束與節流視窗。
  3. 穩定日誌 — 仍抖動就調 ThrottleInterval
  4. 在同一 UID、無 launchd下互動複現。
  5. 設定 diff與機密輪換雙人覆核。
  6. Roll forward到已知良好的 npm版本,而非正式環境的神秘修補。
  7. 事件後 — 工單一小段:根因、偵測缺口、護欄(例如 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 堆疊,因此團隊會把這些文章與區域節點定價接入說明一起讀,當他們已超出綁在單一人身上的筆電規模時。

讓 OpenClaw 與 launchd、日誌與網路同向對齊

1–2 TB · Apple Silicon · SSH/選用 VNC