记一次 Hermes Gateway 状态文件引发的「幽灵新会话」
文章摘要
|
记一次 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 必然变化,但如果状态文件没有同步更新,就会出现:
- cron 认为 gateway 没在跑(因为 PID 对不上)
- session 路由错乱(新会话被当成另一个 session)
解决方案
删掉旧的状态文件,让 Gateway 重新生成:
rm ~/.hermes/profiles/<profile>/gateway_state.json
# 然后重启 gateway,用 stop + start,不要直接 kill + start
重启后新的状态文件会记录正确的 PID,问题解决。
避坑建议
- 重启 gateway 用 stop + start,不要直接 kill + start,这样状态文件会正确更新
- 遇到 cron 报 not-running 但进程活着,先查 PID 是否对得上
- 多会话乱跳时,优先看 gateway_state.json 的 session token 是否与当前对话一致
这个问题本质上是一个「状态同步」问题——进程重启了,但持久化文件没更新,导致后续所有操作都在读取一个过期的状态。排查思路就是「进程在不在」→「PID 对不对」→「状态文件新不新」。
希望对遇到同样问题的小伙伴有帮助。