Gateway 导读

网关锁:同一台机器只能跑一个网关实例

网关启动时立刻绑定 WebSocket 端口(默认 18789),端口被占就报错退出,不用锁文件,进程挂了系统自动释放。最容易踩的坑是 macOS 应用有 PID 守卫但运行时锁靠端口绑定,两个机制别搞混。

先讲这一页到底在解决什么

网关锁:同一台机器只能跑一个网关实例

网关启动时立刻绑定 WebSocket 端口(默认 18789),端口被占就报错退出,不用锁文件,进程挂了系统自动释放。最容易踩的坑是 macOS 应用有 PID 守卫但运行时锁靠端口绑定,两个机制别搞混。

原文共 5 节,先看 Why 路径:/gateway/gateway-lock 查看官方原文

第一站

🚪 真正的锁不是纸条,是“我先把门口站住”

很多程序会额外写一个 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

很多时候不是坏人占门,而是你上一份 Gateway 其实还活着。

🚪

openclaw gateway --port <port>

像给这次值班改一扇新门。原门牌被占,就换个没人站的位置。

🧱

多个 Gateway 要隔离家当

官方强调多个实例不仅端口要不同,配置、状态目录、profile 也要分开,不然像两个人共用一个抽屉,迟早打架。

⚠️

macOS app 自己也会先拦一手

桌面 app 还有一层轻量守卫,但真正算数的,还是运行时能不能把端口占住。

第四站

🧹 为什么它不怕崩掉后留下“假锁”

这页有个很实用的点:哪怕进程是崩掉、被杀掉,操作系统也会把那个监听端口放掉。

💨 正常退出

像门卫下班,把门口还回去。

💥 崩溃 / SIGKILL

像门卫被突然抬走了。虽然过程不好看,但门口位置还是会被系统收回。

🚫 没有锁文件残局

所以你不用去到处删 stale lock 文件。这里没有那种“鬼门卫还挂名”的问题。

🎈 一句话

它把“门锁”绑在操作系统手里,所以现场会更干净。

最后总结

🎈 把 Gateway Lock 这页压成一句话

Gateway Lock 讲的是:OpenClaw 不靠写纸条占位,而是直接把端口站住,所以同一扇门不会有两个门卫,崩掉后也不会留下假的锁。

如果你下一页只想继续看一页,我建议看 /gateway/index。因为知道“门口只能有一个门卫”后,下一步就该知道这整栋 Gateway 楼到底都管什么。