
1. Openclaw Gateway 进程异常停止的现场还原与排查思路Openclaw Gateway 是 Openclaw 体系里负责承接模型请求、转发到后端推理服务的中间层组件默认监听 5000 端口。它本身不产生模型能力但一旦挂掉所有指向它的请求都会直接失败。所以「Openclaw Gateway 进程异常停止」这个问题本质不是模型不可用而是中间层没有守护好。适合谁看自己用脚本 nohup 起 Gateway、跑在测试机或小集群上、没有 systemd 托管、又希望服务能自愈的开发者。我遇到的现象和大多数人一样巡检时发现 5000 端口连不上探针命令直接报连接被拒。先别急着重启按下面顺序定位能省掉很多瞎猜。第一步确认进程是否真的没了ps aux | grep -i openclaw-gateway ss -lntp | grep 5000如果ps里没有openclaw-gateway而ss里 5000 也没监听说明进程确实退出了。这时候执行探针openclaw gateway probe # 典型输出ECONNREFUSED 127.0.0.1:5000ECONNREFUSED的含义是「目标端口没有进程在监听」不是网络不通也不是防火墙拦截。这一点很关键很多人第一反应去查安全组其实方向错了。第二步看日志最后几行。Gateway 的日志通常在/var/log/gateway/dev.logtail -n 100 /var/log/gateway/dev.log我实测下来最常见的情况是日志最后一条是正常的业务通信记录没有任何堆栈、没有 panic、没有 error。进程属于「静默退出」。这种静默退出一般指向三类原因被外部信号 kill比如 OOM killer 或人工误操作、进程内部异步异常未被捕获、日志缓冲没刷盘就退出了。第三步查退出码和系统信号。如果你是用 shell 脚本起的脚本本身不会记录退出码。可以借助dmesg看有没有 OOMdmesg -T | grep -i -E killed process|out of memory | tail -n 20如果看到Killed process ... (openclaw)这类记录基本可以确认是内存不足被内核终止。这时候要做的不是加守护而是先限制内存或加 swap否则守护进程会陷入「重启—被杀—再重启」的死循环。第四步判断是「进程死了」还是「进程僵死」。有些情况下进程还在但事件循环卡住端口不响应。用curl -sS -m 3 http://127.0.0.1:5000/health || echo health check failed如果进程在但 health 不通说明是僵死守护工具的重启策略要配合健康检查不能只看进程存活。把这几步走完你手里应该有三条信息进程是否存活、日志最后状态、是否有 OOM 记录。这三条决定了后面选 PM2 还是 supervisord以及重启策略怎么配。下面进入守护方案和 TaoToken 接入的实操部分。2. TaoToken 前置准备统一 Key 与 API 通道在配守护之前先把 Gateway 的上游通道理顺。Openclaw Gateway 需要调用模型服务如果每个环境都散落着不同的 Key 和 endpoint排查问题时很难判断是 Gateway 挂了还是上游鉴权失败。我建议把上游统一到 TaoToken 的 API 通道这样 Gateway 只需要维护一份 Base URL 和一把 Key。TaoToken 是什么它是一个统一的模型 API 聚合通道对外暴露兼容 OpenAI 风格的接口你可以在一个控制台里管理 Key、查看调用量、切换模型。对 Gateway 这种中间层来说好处是上游地址固定、鉴权方式统一出问题时能快速区分「Gateway 进程问题」和「上游调用问题」。适合谁用自己搭 Gateway、需要接多个模型、又不想在每个服务里硬编码不同厂商 Key 的开发者。尤其是做本地 Agent、Coding 工具链的场景统一通道能省掉大量配置同步工作。前置准备分三步。第一步拿到 API Key。访问控制台创建https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite创建后复制 Key形如sk-xxxxxxxx。注意 Key 只在创建时完整显示一次先存到安全的地方。第二步确认 Base URL。TaoToken 的 API 入口是https://taotoken.net/api这个地址不加任何查询参数直接作为 OpenAI 兼容的 base_url 使用。Gateway 里配置上游时填这个即可。第三步确认要用的 Model ID。不同模型对应不同 ID比如常见的对话模型、代码模型各有自己的标识。你可以在模型对话页面先验证一把https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite在页面里选模型、发一条测试消息确认能通再把这个 Model ID 抄到 Gateway 配置里。这一步别省很多人 Gateway 起不来其实是 Model ID 写错了结果误判成进程问题。如果你用的是 Claude Code 这类工具链接入文档在这里https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite文档里有 Base URL、Key、Model ID 三件套的完整说明。长期跑编码 Agent 的话可以考虑 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite前置准备做完你手里应该有一把 Key、Base URLhttps://taotoken.net/api、一个验证过的 Model ID。接下来把它们写进 Gateway 配置再上守护。3. 可复制配置PM2 ecosystem 与 supervisord 守护片段这一节给两份可直接复制的配置。先讲 PM2再讲 supervisord最后讲 Gateway 上游指向 TaoToken 的配置片段。3.1 PM2 ecosystem.config.jsPM2 适合 Node 生态、想要开箱即用监控和开机自启的场景。先安装npm install -g pm2创建/opt/app/ecosystem.config.jsmodule.exports { apps: [ { name: openclaw-gateway, script: openclaw, args: gateway run --port 5000, instances: 1, autorestart: true, watch: false, max_memory_restart: 1G, min_uptime: 10s, max_restarts: 10, restart_delay: 3000, kill_timeout: 5000, env: { NODE_ENV: production, OPENCLAW_GATEWAY_PORT: 5000 }, error_file: /var/log/gateway/err.log, out_file: /var/log/gateway/out.log, merge_logs: true, time: true } ] };几个参数值得说明。max_memory_restart: 1G是内存超过 1G 自动重启配合前面 OOM 排查能避免被内核直接杀。min_uptime: 10s表示进程存活不足 10 秒就退出算一次异常启动max_restarts: 10限制 10 次内反复重启超过就停防止死循环刷日志。restart_delay: 3000是重启前等 3 秒给端口释放留时间。启动并保存mkdir -p /var/log/gateway pm2 start /opt/app/ecosystem.config.js pm2 startup pm2 savepm2 startup会输出一条命令按提示复制执行才能生成开机自启脚本。pm2 save把当前进程列表固化重启后自动恢复。3.2 supervisord 守护片段如果服务器已经装了 supervisord直接加配置更省事。创建/etc/supervisor/conf.d/gateway.conf[program:openclaw-gateway] commandopenclaw gateway run --port 5000 directory/opt/app autostarttrue autorestarttrue startsecs10 startretries3 stopwaitsecs10 userroot environmentNODE_ENVproduction,OPENCLAW_GATEWAY_PORT5000 stdout_logfile/var/log/gateway/out.log stderr_logfile/var/log/gateway/err.log stdout_logfile_maxbytes50MB stdout_logfile_backups5 redirect_stderrfalsestartsecs10表示进程启动后要稳定运行 10 秒才算启动成功否则算失败并重试。startretries3是启动失败重试 3 次。autorestarttrue是崩溃自动重启。日志按 50MB 轮转保留 5 份避免日志撑爆磁盘。生效supervisorctl reread supervisorctl update supervisorctl start openclaw-gateway supervisorctl status openclaw-gateway3.3 Gateway 上游指向 TaoToken不管用哪种守护Gateway 的上游配置要统一。以常见的环境变量或配置文件为例把 Base URL、Key、Model ID 三件套写全export OPENCLAW_UPSTREAM_BASE_URLhttps://taotoken.net/api export OPENCLAW_UPSTREAM_API_KEYsk-你的Key export OPENCLAW_UPSTREAM_MODEL你的ModelID如果 Gateway 用 JSON 配置对应片段{ gateway: { port: 5000, upstream: { baseUrl: https://taotoken.net/api, apiKey: sk-你的Key, model: 你的ModelID, timeoutMs: 60000 } } }注意baseUrl结尾不要多加/v1TaoToken 的入口就是https://taotoken.net/api具体路径由 SDK 拼接。timeoutMs建议给足模型响应慢时别让 Gateway 误判上游超时。如果你用 Claude Code 或 Cline 这类工具配置里同样要写全 Base URL、Key、Model ID 三项缺一不可。Cline 的 MCP 配置里如果引用 Gateway也要确保 Gateway 本身的上游是通的否则会误报成 MCP 连接失败。4. 验证请求与成功结果配置写完别急着宣布搞定按顺序验证三层进程层、端口层、上游层。进程层PM2 用pm2 status pm2 logs openclaw-gateway --lines 50supervisord 用supervisorctl status openclaw-gateway tail -n 50 /var/log/gateway/out.log看到online或RUNNING且日志没有反复重启记录进程层就算过。端口层ss -lntp | grep 5000 curl -sS -m 5 http://127.0.0.1:5000/health/health返回 200 或{status:ok}之类说明 Gateway 本身活着且能响应。上游层这是最容易被忽略的一层。直接打 Gateway 的业务接口让它走一次 TaoTokencurl -sS -m 30 -X POST http://127.0.0.1:5000/v1/chat/completions \ -H Content-Type: application/json \ -d { model: 你的ModelID, messages: [{role: user, content: ping}] }如果返回正常的choices结构说明 Gateway 到 TaoToken 的链路是通的。如果这里报 401问题在 Key报 model not found问题在 Model ID报 timeout问题在上游网络或超时设置。这三种错误和「进程异常停止」是两码事别混在一起排查。验证自动重启可以手动模拟一次崩溃# PM2 pm2 stop openclaw-gateway pm2 start openclaw-gateway # 或者直接 kill 进程观察是否自动拉起 pkill -f openclaw-gateway sleep 5 pm2 statussupervisord 同理kill掉进程后等几秒supervisorctl status应该显示重新拉起。如果没拉起检查autorestart和startretries配置。成功的结果应该是进程被 kill 后 3 到 10 秒内自动恢复/health重新可用业务请求正常返回。到这一步守护配置才算真正生效。5. 本篇常见错排查401、local proxy failed、reading choices、OAuth这一节对照真实报错逐个说清楚原因和改法。这些错误经常被误判成「Gateway 进程挂了」其实根因完全不同。401 Unauthorized。现象是 Gateway 进程活着但业务请求返回 401。原因通常是 Key 写错、Key 过期、或者 Key 没带上。检查三处环境变量OPENCLAW_UPSTREAM_API_KEY是否生效、配置文件里的apiKey是否被覆盖、启动脚本里有没有把 Key 传进去。用env | grep OPENCLAW确认运行时环境。改完后重启 Gateway别只 reload 配置有些实现不热加载。local proxy failed。这个报错一般出现在工具链里含义是本地代理层连不上 Gateway。先确认 Gateway 端口在监听再确认工具里配的地址是http://127.0.0.1:5000而不是别的端口。如果 Gateway 和工具不在同一台机器地址要换成实际 IP并确认防火墙放行。注意这里说的「代理」是本地转发层不是网络出口工具别混淆。reading choices 报错。典型信息是Cannot read properties of undefined (reading choices)。这说明上游返回的结构里没有choices字段通常是上游返回了错误对象但 Gateway 没做错误分支处理直接去读choices就崩了。排查方法在 Gateway 日志里找上游原始响应看是不是 401、429 或 5xx。如果是 429说明触发限流需要降并发或换 Key如果是 5xx是上游临时故障守护重启解决不了要加重试和退避。OAuth 相关报错。如果你用的是 Claude Code 这类需要 OAuth 的工具报错可能是 token 过期或授权失效。这类问题不在 Gateway 进程层而在工具链的鉴权层。处理方式是重新走一遍授权流程或者改用 API Key 方式接入 TaoToken。接入文档里有两种方式的说明https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite另外如果你用 Codex 的auth.json要确保里面的 Base URL、Key、Model ID 三件套和 Gateway 上游一致。三件套任何一项不一致都会出现「Gateway 活着但请求失败」的假象。排查顺序建议固定下来先看进程在不在再看端口通不通再看上游返回什么最后才看工具链鉴权。按这个顺序90% 的「进程异常停止」误判都能快速纠正。6. 稳定运行与后续接入建议守护配好只是第一步长期稳定还要做几件事。日志轮转必须配。PM2 用pm2 install pm2-logrotatesupervisord 用stdout_logfile_maxbytes和stdout_logfile_backups。日志不轮转磁盘满了进程照样挂而且挂得莫名其妙。健康检查要独立于进程存活。进程在但僵死的情况不少见建议在守护工具外再加一层定时探活比如每分钟 curl 一次/health连续失败就触发重启。PM2 可以用pm2-health之类的插件supervisord 可以配合 event listener。内存上限要设。前面max_memory_restart和 OOM 排查都指向同一件事Gateway 内存涨到一定程度会被内核杀。设上限让它主动重启比被动被杀更可控。上游统一到 TaoToken 后Key 轮换和用量查看都在一个控制台完成不用逐个服务改配置。需要新建或轮换 Key 时走这里https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite如果你还在选型阶段想先验证模型连通性用模型对话页面最快https://taotoken.net/model-chat?utm_sourcetaotoken_aicg_blog_endutm_contentmodel-chatutm_campaignrewrite长期跑编码 Agent、需要稳定配额和统一通道的看 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite最后提醒一句守护工具解决的是「进程挂了能自动拉起」解决不了「上游一直报错导致进程反复重启」。如果日志里看到进程每隔几秒重启一次先去看上游返回别一味调大max_restarts那只会把问题掩盖得更深。