2
0

记一次 Hermes Gateway 状态文件引发的「幽灵新会话」

2026-08-06 17:49:18
2026-08-06 17:49:22
文章摘要
|

记一次 Hermes Gateway 状态文件引发的「幽灵新会话」

背景

今天遇到一个有意思的问题:明明只在一个会话里聊天,却莫名其妙多出了一个新会话,导致上下文全乱了。查了半天,发现是 Gateway 的状态文件在作妖。

问题现象

  • cron 任务报错「gateway not running」,但进程明明还活着
  • 用户发送消息后 bot 没有回应,像个哑巴
  • 多出一个「幽灵」新会话,对话历史错乱

排查过程

第一步,先看进程状态:

抓进程列表,看 gateway 是否在跑、PID 是多少。

第二步,看 gateway_state.json:

路径一般在 ~/.hermes/profiles/<profile>/gateway_state.json,里面记录了运行时的 PID、启动时间、session token 等关键信息。如果发现文件里写的 PID 跟实际进程 PID 对不上——说明进程重启过,但状态文件没有同步更新。

根因

当 Gateway 重启后,新进程的 PID 必然变化,但如果状态文件没有同步更新,就会出现:

  1. cron 认为 gateway 没在跑(因为 PID 对不上)
  2. session 路由错乱(新会话被当成另一个 session)

解决方案

删掉旧的状态文件,让 Gateway 重新生成:

rm ~/.hermes/profiles/<profile>/gateway_state.json
# 然后重启 gateway,用 stop + start,不要直接 kill + start

重启后新的状态文件会记录正确的 PID,问题解决。

避坑建议

  1. 重启 gateway 用 stop + start,不要直接 kill + start,这样状态文件会正确更新
  2. 遇到 cron 报 not-running 但进程活着,先查 PID 是否对得上
  3. 多会话乱跳时,优先看 gateway_state.json 的 session token 是否与当前对话一致

这个问题本质上是一个「状态同步」问题——进程重启了,但持久化文件没更新,导致后续所有操作都在读取一个过期的状态。排查思路就是「进程在不在」→「PID 对不对」→「状态文件新不新」。

希望对遇到同样问题的小伙伴有帮助。

支持与分享

如果这篇文章对你有帮助,欢迎分享给更多人或者给予支持!

评论