2026 OpenClaw 网关诊断:当 doctor 全绿而 LaunchAgent 仍反复重启
在租用的无头 Mac mini M4 上,工程团队常遇到一种令人抓狂的分裂:openclaw doctor 在交互式 SSH 会话里一片绿色,而 launchd 托管的网关却在数秒周期内崩溃重启。 这不是玄学,而是两套运行上下文的差异:登录 shell 会把 .zprofile、代理变量与 nvm 路径注入进程,LaunchAgent 却只读 plist 中的 EnvironmentVariables;前台的 Node 能解析到你手动 export 的反代头,后台任务却在证书链或工作目录上硬栽跟头。本文给出可复用的对照矩阵、六步把两边拉齐的审计路径,以及何时应该把锅从「应用」挪回「launchd 生命周期」。排障起点见 OpenClaw 网关故障排除;launchd 崩溃循环专项见 launchd 崩溃循环排查;线上健康语义见 网关健康检查;TLS 与反向代理组合见 HTTPS 反代模式;首次无头安装基线见 无头首次安装指南;本地推理与远端 API 并行见 本机 LLM 与云端 API。
两个世界:交互 shell 与 LaunchAgent
当你通过 SSH 登录时,常见路径是 bash -l 或 zsh 登录文件加载一大堆「看起来无害」的别名与路径;doctor 子命令继承了这份偶然正确。plist 若只写了 ProgramArguments 而未显式继承当前用户的 PATH,你就会发现「 which node 在 shell 里指向家目录,在 launchd 里指向系统自带的过时二进制」。同理,HTTPS_PROXY 若在 shell rc 里设置却未入 plist,CLI 走代理、网关直连接口就会表现为间歇性超时。把这些变量从脑子里挪到表格里对照,比反复试错更快。远程授权与屏幕相关阻塞时,可短时借助 VNC;日常加固参考 帮助文档。
偏差矩阵:症状指向哪一侧
| 你观察到的现象 | doctor 会话 | LaunchAgent | 优先核对项 |
|---|---|---|---|
| 端口偶现可连随后断开 | 可能长期正常 | 快速重启 | ThrottleInterval、崩溃退出码、stderr 路径是否可写 |
| 模型提供商 API 偶发 401 | 手动 echo 密钥正常 | 子进程拿不到密钥 | plist 中是否内嵌密钥文件路径而非内联;WorkingDirectory 是否错位 |
| 仅 HTTPS 反代外侧 502 | 本机 curl 正常 | 上游指向已死子进程 | 反代 upstream 与健康检查与 HTTPS 反代文 对齐 |
| CPU 平稳却疑似卡死 | 前台阻塞在推理 | 看不到日志 | 标准输出目录缺失导致静默丢弃;见 launchd 文 |
把 doctor 当成「一致性快照」而不是判决书
doctor 的价值在于快速枚举:Node 版本、到沙盒目录的写权限、到模型文件的读权限、到 Unix socket 的可访问性。它默认假设「当前会话即生产会话」。一旦你接受这条假设被打破,就会把 doctor 输出重命名为 baseline,然后在 LaunchAgent 环境下(去掉登录 rc)复跑同样的检查命令,差异就是偏差来源。若健康探针与 doctor 结论冲突,优先采信 健康检查 所定义的成功语义,因为它更贴近真实监听端口与路由。
六步收敛:从分裂到单一真源
- 冻结版本:记录 Node、OpenClaw 与系统补丁号,避免排障中途被动升级。
- 导出 shell 基线:在交互会话中对 PATH、代理、语言环境变量做脱敏存档。
- 最小 plist:新建仅含
ProgramArguments与WorkingDirectory的测试任务,验证能启动即逐步加变量。 - 对齐 stderr:确保目录存在且属主正确,避免「崩溃却无日志」的假阴性。
- 对照安装顺序:若曾跳过 无头安装 中的辅助功能步骤,补授权后再测 LaunchAgent。
- 推理路径验证:对混合推理场景用 本机与云端 API 文核对内存护栏,避免 OOM 伪装成配置错误。
FAQ:doctor 与 LaunchAgent 在工单里怎么写
| 问题 | 实操答案 |
|---|---|
| 是否应在 plist 里写一长串 export | 否;把环境变量集中在 plist 的 EnvironmentVariables 或注入文件,并在 wiki 中注明变更流程。 |
| doctor 报黄色项是否可以忽略 | 仅当 LaunchAgent 侧已用等价配置覆盖;否则黄色项往往是无头差异的先行指标。 |
| 是否可以用 root LaunchDaemon 规避用户环境 | 谨慎;权限模型变更会引入钥匙串与 TCC 新雷区,多数团队应修 plist 而非升格守护进程。 |
| 仍然无解时第一步是什么 | 停止 LaunchAgent,前台运行同一参数集直至单一错误行稳定出现,再回到 网关故障排除 的结构化清单。 |
Mac mini M4 无头平面上的最后一层意义
当你的偏差根因是本地 14B 级模型与远端工具编排争抢 16GB 统一内存时,前台 doctor 与后台 LaunchAgent 可能分别落在「内存尚未触顶」与「刚刚触发压力」两个时间片。Apple Silicon M4 的 CPU 与神经引擎协同让这类抖动来得更晚,但不会消失——因此仍需结合上面六步把环境变量与工作目录锁死。1Gbps 网口保证大模型分片或容器拉取不至于拉长启动窗口,使 launchd 误判「启动超时」。需要把网关当产品环境长期托管时,建议通过 定价页 稳定租用区域与规格,并在 控制台 保留一台「仅 plist、不叠加实验 rc」的黄金样机专供对照。