OpenClaw本地部署启动失败且报EADDRINUSE,说明端口18789被占用;需先通过lsof或netstat定位PID,再强制终止进程或改用新端口启动。
☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

OpenClaw本地部署启动失败,浏览器打不开 http://127.0.0.1:18789,终端报错 EADDRINUSE 或 address already in use,说明你配置的监听端口已被其他进程悄悄占用了,必须立刻定位并释放该端口才能继续。
确认OpenClaw实际想用的端口
打开 OpenClaw 配置文件,路径通常是 ~/.openclaw/config.yaml(Linux/macOS)或 %USERPROFILE%\.openclaw\config.yaml(Windows),查找 gateway: 下的 port: 字段。默认值是 18789,但如果你改过,就以配置文件里写的数字为准。
【务必确认配置里写的是纯数字端口,不是服务别名(如 http-alt)】
这一步跳不得——填了别名,lsof 会解析成 8080,但程序实际要绑的是 18789,查错方向就全偏了。
快速定位谁在抢端口
方法一:Linux/macOS 用 lsof(推荐)
执行:sudo lsof -i :18789 -P。
看到输出中 PID 和 COMMAND 列,就知道哪个进程在占着不放。
方法二:Windows 用 netstat
在 PowerShell 或 CMD 中运行:netstat -ano | findstr :18789。
末尾数字就是 PID,记下来。
方法三:通用验证法(所有平台)
执行:curl -v http://localhost:18789/health。
如果返回 Connection refused,说明端口空闲;如果卡住或返回 200,那肯定有人在跑服务。
终止占用进程或释放端口
第一步:确认 PID 是否真实存活
执行:ps -p 12345(把 12345 替换为你查到的 PID)。
若提示 No such process,说明进程已死,但 socket 还卡在 TIME_WAIT 状态,等 60 秒自动释放即可,不用杀。
第二步:检查是否为 systemd socket 激活服务
执行:systemctl list-sockets | grep 18789。
如果匹配到 xxx.socket 单元,直接停用它:sudo systemctl stop xxx.socket,而不是 kill 进程——否则下次开机又自动拉起。
第三步:强制终止用户态进程
Linux/macOS:sudo kill -9 12345
Windows:taskkill /F /PID 12345
第四步:验证是否真正释放
再次运行 sudo lsof -i :18789 或 netstat -ano | findstr :18789,无任何输出即成功。
临时绕过冲突:命令行指定新端口
关闭当前实例:openclaw stop
用新端口启动网关:openclaw gateway --port 28089
访问地址同步变成:http://127.0.0.1:28089
这步操作起来很简单,直接敲命令就行,适合快速验证是否真为端口问题,无需改配置文件。
永久解决:修改配置文件端口
① 备份原始配置:cp ~/.openclaw/config.yaml ~/.openclaw/config.yaml.bak
② 编辑 config.yaml,找到 gateway: → port: 行,把 18789 改成未被占用的端口,例如 30089 或 42100
③ 端口号必须在 1024–65535 范围内,避开系统保留端口(如 80、443、3306)
④ 保存后执行:openclaw restart


















