Clash 端口被占用怎么办:定位冲突进程与修改混合端口
启动报错 bind: address already in use 的完整处理流程:用 netstat 与 lsof 找出占用 7890 端口的进程,判断该结束进程还是改端口,并给出改端口后同步系统代理设置的步骤。
启动报错 bind: address already in use 的完整处理流程:用 netstat 与 lsof 找出占用 7890 端口的进程,判断该结束进程还是改端口,并给出改端口后同步系统代理设置的步骤。
Clash 客户端(以及基于 Clash Meta / mihomo 内核的各类衍生客户端)启动时会在本机监听一个或多个端口,用来接收系统或浏览器转发过来的代理流量。最常见的是mixed-port(混合端口),默认值通常是7890,它同时接受 HTTP 与 SOCKS5 协议的连接,取代了早期需要分别配置port(HTTP)和socks-port(SOCKS5)两个端口的写法。除此之外,还有用于管理面板通信的external-controller端口,常见值是9090。
当客户端在启动阶段尝试绑定这些端口时,如果操作系统告知该端口已经被另一个进程占用,就会抛出bind: address already in use这一类报错,程序随即中止启动或界面提示连接失败。这是操作系统层面的资源互斥机制:同一个 TCP 端口在同一时刻只能被一个进程独占监听,谁先抢到,后来者就会被拒绝。
端口冲突和订阅失效、节点不可用是两类完全不同的问题。前者是客户端本身无法完成初始化,后者是客户端已经正常运行但代理节点连不通。看到bind相关的报错文字,基本可以确定是端口层面的问题,不必先去排查订阅或节点。
不同操作系统查询端口占用的命令不同,但思路一致:先按端口号找到对应的进程 ID(PID),再按 PID 反查进程名称,确认它到底是谁。
打开命令提示符或 PowerShell,执行:
netstat -ano | findstr :7890
输出中最后一列数字就是 PID,例如看到12480,再执行:
tasklist /FI "PID eq 12480"
即可看到占用端口的进程名称,常见的是残留的clash.exe、clash-verge.exe、其他代理软件的可执行文件,或者是某些安全软件的转发组件。
macOS 与大多数 Linux 发行版都自带lsof,执行:
lsof -i :7890
输出的COMMAND列即为进程名,PID列为进程编号。如果系统没有lsof,Linux 下也可以用:
netstat -anp | grep 7890
# 或使用较新的 ss 命令
ss -ltnp | grep 7890
需要注意的是netstat -anp在部分发行版上需要sudo权限才能看到进程名,否则 PID 列会显示为空。
| 命令 | 系统 | 关键输出列 |
|---|---|---|
| netstat -ano | Windows | 本地地址、PID |
| tasklist /FI | Windows | 进程名、PID |
| lsof -i :端口 | macOS / Linux | COMMAND、PID |
| ss -ltnp | Linux | 本地地址、进程信息 |
查到占用端口的进程之后,不要急着一律强制结束。先判断它是谁、为什么在跑,再决定处理方式。
如果多次重启电脑后端口冲突依然反复出现,基本可以排除“临时残留进程”的可能,说明有另一个程序把该端口设成了固定监听,应该优先考虑改端口而不是每次都去结束进程。
大多数图形化客户端都提供了端口设置入口,通常在“设置”或“基础”页面里能直接修改混合端口数值,保存后客户端会自动重启监听。如果客户端没有对应入口,或者你在直接编辑配置文件,可以在 YAML 中找到并修改这一行:
mixed-port: 7891
external-controller: 127.0.0.1:9091
把默认的7890改为一个当前未被占用的端口号即可,常见的替代选择是7891、17890等不容易与其他常见软件冲突的数字。如果配置文件里用的是旧式写法,分别声明了port(HTTP)与socks-port(SOCKS5)而不是mixed-port,记得两个端口都要一起改,并确认二者不相同,否则同样会绑定失败。
修改完成后必须完全重启客户端(不是仅仅重新加载配置),因为端口监听是在进程启动阶段完成的,热重载配置往往不会重新绑定端口。
把 Clash 的端口改掉之后,如果之前是通过“系统代理”模式接入(而不是 TUN 模式接管全局流量),系统里记录的代理端口也必须同步修改,否则浏览器和其他应用依然会往旧端口发请求,连接会直接被拒绝。
http_proxy、https_proxy、all_proxy等变量里的端口号,例如:export all_proxy=http://127.0.0.1:7891
export http_proxy=$all_proxy
export https_proxy=$all_proxy
如果使用的是 PAC 自动配置脚本或系统级“自动检测设置”,通常无需手动改端口,但仍建议在改完后打开浏览器访问一个网站验证代理确实生效,避免端口改动后代理悄悄失效却没有察觉。
第一,只改了mixed-port却没有同步external-controller的端口时,如果 9090/9091 也恰好被占用,客户端的管理面板(Dashboard)会打不开,但代理转发功能其实是正常的,不要把这个现象误判为“配置又坏了”。第二,部分客户端会把端口号写入本地缓存或历史配置快照,直接改 YAML 文件后如果客户端仍从缓存读取旧值,建议先在客户端里手动清除或重新导入一次配置,确保新端口真正生效。
结束进程前务必确认进程名称,不要按 PID 盲目taskkill或kill -9系统关键进程。如果不确定某个陌生进程是否安全,先搜索其可执行文件名称,再决定是否终止。
端口冲突处理完成后,建议直接使用官方渠道的最新客户端版本,减少因老版本已知问题带来的重复排查。