先确认是不是你自己的旧 Gateway
很多时候不是坏人占门,而是你上一份 Gateway 其实还活着。
Gateway 导读
网关启动时立刻绑定 WebSocket 端口(默认 18789),端口被占就报错退出,不用锁文件,进程挂了系统自动释放。最容易踩的坑是 macOS 应用有 PID 守卫但运行时锁靠端口绑定,两个机制别搞混。
先讲这一页到底在解决什么
网关启动时立刻绑定 WebSocket 端口(默认 18789),端口被占就报错退出,不用锁文件,进程挂了系统自动释放。最容易踩的坑是 macOS 应用有 PID 守卫但运行时锁靠端口绑定,两个机制别搞混。
第一站
很多程序会额外写一个 lock 文件,像在门上贴纸条:“这里有人了。” OpenClaw 这页说的不是那种做法。
ws://127.0.0.1:18789 就像 Gateway 默认要站的位置。
Gateway 一启动,就马上去把这个端口占住。谁先占到,谁就是当前门卫。
因为不是写锁文件,所以也不会留下“人都走了,纸条还贴着”的假现场。
这把锁的原理就是:谁先把端口站住,谁就负责守门。
第二站
EADDRINUSE 时,翻成人话就是“门口已经有人了”你看到报错时,不要被英文吓住。它大多数时候只是在说:这个门牌号已经被别的进程占了。
another gateway instance is already listening像系统直说:“已经有另一个 Gateway 在这里站岗了。”
failed to bind gateway socket像系统说:“我想站到门口去,但没站成。” 原因可能是门口被占,也可能是别的底层网络问题。
EADDRINUSE最值得先想到的翻译就是:“同一个地址和端口,已经有人先用了。”
先不要怀疑消息系统坏了,先怀疑门口是不是已经有人。
第三站
这页的操作建议其实很朴素。既然门口只能站一个人,那你要么把旧门卫请走,要么给新门卫换个门牌。
很多时候不是坏人占门,而是你上一份 Gateway 其实还活着。
openclaw gateway --port <port>像给这次值班改一扇新门。原门牌被占,就换个没人站的位置。
官方强调多个实例不仅端口要不同,配置、状态目录、profile 也要分开,不然像两个人共用一个抽屉,迟早打架。
桌面 app 还有一层轻量守卫,但真正算数的,还是运行时能不能把端口占住。
第四站
这页有个很实用的点:哪怕进程是崩掉、被杀掉,操作系统也会把那个监听端口放掉。
像门卫下班,把门口还回去。
像门卫被突然抬走了。虽然过程不好看,但门口位置还是会被系统收回。
所以你不用去到处删 stale lock 文件。这里没有那种“鬼门卫还挂名”的问题。
它把“门锁”绑在操作系统手里,所以现场会更干净。
最后总结
Gateway Lock 讲的是:OpenClaw 不靠写纸条占位,而是直接把端口站住,所以同一扇门不会有两个门卫,崩掉后也不会留下假的锁。
如果你下一页只想继续看一页,我建议看 /gateway/index。因为知道“门口只能有一个门卫”后,下一步就该知道这整栋 Gateway 楼到底都管什么。