2026 年 OpenClaw macOS 雙 LaunchAgent 閘道與 Mac 代理並行運維
安全與運維 2026-04-03

2026年OpenClaw macOS雙LaunchAgent並存排查:ai.openclaw.gateway 與 ai.openclaw.mac 並行時的 launchctl 修復、設定統一與獨享遠端 Mac SSH 無頭運行清單 + FAQ

在單一 macOS 主機上,OpenClaw 常把職責切開:閘道(ai.openclaw.gateway)負責對外 HTTP/WebSocket 與路由;Mac 執行端(ai.openclaw.mac)承載僅 Apple 生態才有的 CLI、UI 自動化掛鉤與本機推論端點。兩者都用 launchd 常駐是合理設計——但啟動順序錯置、重複環境與埠衝突,正是最常見的故障型態。本文給出可復現的 launchctl 修復流程、OPENCLAW_* 單一來源佈局,以及獨享遠端 Mac SSH 無頭檢核表。若你要把「長駐服務+ SSH 帳戶隔離」寫進企業 Runbook,建議延伸閱讀 2026年企業 iOS/macOS CI 選型:GitLab Runner 與 GitHub Actions 自託管 Runner 對比——獨佔遠端 Mac 節點上的併發、SSH 帳戶隔離與運維 FAQ;資源池層級的 TCO 與 SSH 穩定度取捨可對照 2026年iOS/macOS CI資源池選型:單台高配獨占遠端Mac vs 多台獨占節點 FAQ。

1. 為什麼會有兩個 LaunchAgent?

閘道(ai.openclaw.gateway):綁定對外或 VPN 面向的埠,處理 TLS 終止(若搭配本機反向代理)、將 RPC 分發給工作者,並應在 loopback 依賴可達後再啟動。

Mac 代理(ai.openclaw.mac):執行 macOS 專屬任務——xcodebuild、公證流程、AppleScript/捷徑、螢幕擷取類工具——而不強迫閘道行程繼承 GUI 工作階段。

標籤(Label)分開可避免 launchctl list 語意模糊,並讓你單獨重啟其中一側而不拆掉另一側。

2. 精簡結論:並存規則

  • 一份環境、兩份 plist:兩個 Agent 讀同一組 EnvironmentVariables,或透過 wrapper 載入共用的 ~/.config/openclaw/env——不要讓 OPENCLAW_HOME 在兩邊分叉。
  • 埠是契約:閘道聽 OPENCLAW_GATEWAY_PORT(範例);Mac 代理走 loopback RPC 或 UNIX socket——把這組合寫進 Runbook。
  • ThrottlePolicy:若 Mac 代理在鑰匙圈或 Xcode 授權精靈尚未就緒前就反覆重生,請在 plist 加 ThrottleInterval。
  • 無頭 Mac:需要視窗伺服器 API 時,要有穩定的 GUI 登入脈絡;純 SSH、未授權輔助使用/螢幕錄影時,錯誤往往「看起來像隨機」。

3. 盤點:launchd 眼中的狀態

SSH 進主機、在變更 plist 前先快照:

  • launchctl print gui/$(id -u)/ai.openclaw.gateway,以及同樣對 ai.openclaw.mac 執行。
  • macOS 13+:launchctl blame gui/$(id -u)/ai.openclaw.gateway 可看最近一次退出原因。
  • log show --style syslog --predicate 'process == "launchd"' --last 15m 再篩你的 Label。

4. launchctl 修復順序(建議安全序)

  1. Boot out 殘留工作:launchctl bootout gui/$(id -u) ~/Library/LaunchAgents/ai.openclaw.gateway.plist(ai.openclaw.mac 同理)。這會卸載執行中實例,不刪檔案。
  2. 重新載入 plist:launchctl bootstrap gui/$(id -u) ~/Library/LaunchAgents/ai.openclaw.gateway.plist——先閘道,再 Mac 代理。
  3. 若 RunAtLoad 為 false 需手動起:launchctl kickstart -k gui/$(id -u)/ai.openclaw.gateway
  4. 核對退出碼:launchctl print gui/$(id -u)/ai.openclaw.gateway | grep -i lastexit

剛改過 plist 時,務必先 bootout 再 bootstrap;load/unload 在不同 macOS 世代語意有差,建議固定用現代組合。

5. 設定統一檢核表

關注點 閘道 plist Mac 代理 plist
OPENCLAW_HOME 必須與安裝根目錄絕對路徑一致。 完全相同;避免 ~ 展開陷阱,請寫 /Users/…。
PATH 若未在 ProgramArguments 寫死 node,請納入 Homebrew bin。 若 shell 出來呼叫 xcodebuild,補齊工具鏈路徑或先修好 xcode-select。
機密 API 金鑰放 EnvironmentVariables,或 launchd 可讀、權限 0600 的檔案。 同一檔案;輪換時不要兩份 plist 各抄一份導致不同步。
工作目錄 WorkingDirectory 指向閘道套件根。 常與閘道相同;若不同,仍應共用 OPENCLAW_CONFIG 路徑。
節流/當機 KeepAlive 搭配 SuccessfulExit false,可吸收乾淨關閉。 開機鑰匙圈競態時,ThrottleInterval 建議 ≥ 5 秒。

6. 獨享遠端 Mac:SSH 無頭「單租戶」清單

把機器視為自動化的單一承租:多位管理員重疊 GUI 工作階段時,螢幕錄影與輔助使用的同意狀態最容易髒掉。

  • SSH 強化:僅金鑰登入、AllowUsers automation、長建置時調 ClientAliveInterval。
  • 工作階段策略:專用自動化使用者持有簽章身分鑰匙圈;不要與真人桌面帳戶混用。
  • 無頭 GUI:需要視窗伺服器 API 時,確認自動登入或保留的主控台工作階段;並文件化哪些流程純 TTY 即可。
  • 可觀測性:日誌 tee 到 ~/Library/Logs/OpenClaw/ 並輪替;事故後保留 launchctl print 快照。
  • 更新:macOS 大版本與 Xcode 升級要設閘;升級後重跑 xcode-select 與公證煙測,再推 plist 變更。

7. FAQ:現象 → 懷疑 → 處置

現象 較可能原因 處置
只有一個 Job 起來,另一個立刻退出 OPENCLAW_HOME 不一致,或 ProgramArguments 二進位路徑缺失。 在互動式 shell 用相同 argv 跑通,再把絕對路徑抄回兩份 plist。
閘道日誌出現 EADDRINUSE 殘留閘道或通道仍佔埠。 lsof -nP -iTCP:<port> -sTCP:LISTEN;bootout 閘道;對齊通道上游。
SSH 手動可跑、launchd 下失敗 環境不同(HOME、TMPDIR、鑰匙圈 ACL)。 把 shell 環境鏡像進 plist;在自動化 GUI 工作階段解鎖鑰匙圈一次。
每隔幾秒反覆重啟 網路或 DNS 尚未就緒即崩潰。 加 ThrottleInterval;依賴側等閘道健康檢查回 200 再啟。
螢幕擷取權限錯誤 無頭使用者從未完成 TCC 同意。 在實體/主控台工作階段完成同意;企業環境可改以 MDM 描述檔治理。

8. 在 Mac mini 上讓雙 Agent 安靜地常駐

雙 LaunchAgent 拓撲正是 Apple Silicon Mac mini 擅長的負載:原生 Unix 服務、可預期的溫控曲線,以及閘道 I/O 與本機推論並存時仍保有的記憶體頻寬餘裕——卻沒有塔型工作站的風扇噪音。macOS 與 launchd、SSH、開發者工具鏈銜接順手,Mac 代理路徑也不必為了虛擬化再套一層 shim。

Mac mini M4 待機往往僅數瓦級功耗,卻能維持統一記憶體架構的高頻寬;Gatekeeper、SIP、FileVault 等多層機制,也讓單租戶 SSH 自動化主機的暴露面通常小於一般常開的 Windows 工作站。若你需要獨享、長開的遠端 Mac 來承載 OpenClaw,又不想為機櫃與散熱付出過高固定成本,Mac mini M4 仍是平衡效能、體積與總擁有成本的務實起點。

若你希望把上文雙 Agent 模式跑在「不跟你搶電、也不跟你搶耳朵」的硬體上,建議從首頁的 Mac mini M4 方案出發,把同一套 plist 佈局對應到租賃或自有主機即可。

OpenClaw 雙 Agent 常駐在專用 Mac mini

Mac mini M4 無頭 SSH 錨點

Apple Silicon launchd 友善 原生 SSH
立即了解
於 SSHMac 首頁查看方案
查看全部套餐