Gateway 锁确保同一主机上每个端口只运行一个 Gateway 实例,防止崩溃后遗留过期锁文件,并在控制端口被占用时快速失败并给出清晰错误。

工作机制

  1. Gateway 首先获取 state lock 目录下的 per-config 锁文件,并探测配置端口是否已有监听器
  2. 若锁文件所有者已消失、端口空闲或锁已过期,则重新获取锁并继续启动
  3. Gateway 绑定 HTTP/WebSocket 监听器(默认 ws://127.0.0.1:18789),使用独占 TCP 监听器
  4. 若绑定失败(EADDRINUSE),抛出 GatewayLockError
  5. 关闭时 Gateway 关闭 HTTP/WebSocket 服务器并删除锁文件

错误类型

  • 端口被其他 Gateway 占用:GatewayLockError("another gateway instance is already listening on ws://127.0.0.1:<port>")
  • 其他绑定失败:GatewayLockError("failed to bind gateway socket on ws://127.0.0.1:<port>: …")

操作注意事项

  • 端口被其他进程占用时,错误信息相同;释放端口或用 openclaw gateway --port <port> 指定其他端口
  • 在 systemd 下,检测到已有健康 /healthz 响应的 Gateway 时,新进程退出码为 78(防止 Restart=always 循环)
  • macOS app 在启动 Gateway 前维护自己的轻量级 PID 守卫

多 Gateway 场景

需要多个 Gateway 实例时,必须使用独立的 profile 和唯一端口。

相关链接