☰
Openclaw Gateway进程异常停止排查:从PM2到supervisord的守护配置与TaoToken接入实践
2026/10/8 6:15:00 网站建设 项目流程

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:5000

ECONNREFUSED的含义是「目标端口没有进程在监听」,不是网络不通,也不是防火墙拦截。这一点很关键,很多人第一反应去查安全组,其实方向错了。

第二步,看日志最后几行。Gateway 的日志通常在/var/log/gateway/dev.log:

tail -n 100 /var/log/gateway/dev.log

我实测下来最常见的情况是:日志最后一条是正常的业务通信记录,没有任何堆栈、没有 panic、没有 error。进程属于「静默退出」。这种静默退出一般指向三类原因:被外部信号 kill(比如 OOM killer 或人工误操作)、进程内部异步异常未被捕获、日志缓冲没刷盘就退出了。

第三步,查退出码和系统信号。如果你是用 shell 脚本起的,脚本本身不会记录退出码。可以借助dmesg看有没有 OOM:

dmesg -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_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite

创建后复制 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_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite

在页面里选模型、发一条测试消息,确认能通,再把这个 Model ID 抄到 Gateway 配置里。这一步别省,很多人 Gateway 起不来其实是 Model ID 写错了,结果误判成进程问题。

如果你用的是 Claude Code 这类工具链,接入文档在这里:

https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

文档里有 Base URL、Key、Model ID 三件套的完整说明。长期跑编码 Agent 的话,可以考虑 Coding Plan:

https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite

前置准备做完,你手里应该有:一把 Key、Base URLhttps://taotoken.net/api、一个验证过的 Model ID。接下来把它们写进 Gateway 配置,再上守护。

3. 可复制配置:PM2 ecosystem 与 supervisord 守护片段

这一节给两份可直接复制的配置。先讲 PM2,再讲 supervisord,最后讲 Gateway 上游指向 TaoToken 的配置片段。

3.1 PM2 ecosystem.config.js

PM2 适合 Node 生态、想要开箱即用监控和开机自启的场景。先安装:

npm install -g pm2

创建/opt/app/ecosystem.config.js:

module.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 save

pm2 startup会输出一条命令,按提示复制执行,才能生成开机自启脚本。pm2 save把当前进程列表固化,重启后自动恢复。

3.2 supervisord 守护片段

如果服务器已经装了 supervisord,直接加配置更省事。创建/etc/supervisor/conf.d/gateway.conf:

[program:openclaw-gateway] command=openclaw gateway run --port 5000 directory=/opt/app autostart=true autorestart=true startsecs=10 startretries=3 stopwaitsecs=10 user=root environment=NODE_ENV="production",OPENCLAW_GATEWAY_PORT="5000" stdout_logfile=/var/log/gateway/out.log stderr_logfile=/var/log/gateway/err.log stdout_logfile_maxbytes=50MB stdout_logfile_backups=5 redirect_stderr=false

startsecs=10表示进程启动后要稳定运行 10 秒才算启动成功,否则算失败并重试。startretries=3是启动失败重试 3 次。autorestart=true是崩溃自动重启。日志按 50MB 轮转,保留 5 份,避免日志撑爆磁盘。

生效:

supervisorctl reread supervisorctl update supervisorctl start openclaw-gateway supervisorctl status openclaw-gateway

3.3 Gateway 上游指向 TaoToken

不管用哪种守护,Gateway 的上游配置要统一。以常见的环境变量或配置文件为例,把 Base URL、Key、Model ID 三件套写全:

export OPENCLAW_UPSTREAM_BASE_URL="https://taotoken.net/api" export OPENCLAW_UPSTREAM_API_KEY="sk-你的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结尾不要多加/v1,TaoToken 的入口就是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 50

supervisord 用:

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 的业务接口,让它走一次 TaoToken:

curl -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 status

supervisord 同理,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_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite

另外,如果你用 Codex 的auth.json,要确保里面的 Base URL、Key、Model ID 三件套和 Gateway 上游一致。三件套任何一项不一致,都会出现「Gateway 活着但请求失败」的假象。

排查顺序建议固定下来:先看进程在不在,再看端口通不通,再看上游返回什么,最后才看工具链鉴权。按这个顺序,90% 的「进程异常停止」误判都能快速纠正。

6. 稳定运行与后续接入建议

守护配好只是第一步,长期稳定还要做几件事。

日志轮转必须配。PM2 用pm2 install pm2-logrotate,supervisord 用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_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite

如果你还在选型阶段,想先验证模型连通性,用模型对话页面最快:

https://taotoken.net/model-chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite

长期跑编码 Agent、需要稳定配额和统一通道的,看 Coding Plan:

https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite

最后提醒一句:守护工具解决的是「进程挂了能自动拉起」,解决不了「上游一直报错导致进程反复重启」。如果日志里看到进程每隔几秒重启一次,先去看上游返回,别一味调大max_restarts,那只会把问题掩盖得更深。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询