Linux 上排查端口占用的几种办法
2026-11-02
服务起不来,报 address already in use,第一反应都是去看谁占了端口。顺序上从轻到重,基本三步能定案。
一、ss 最快
ss -tlnp 已经够用了,比 netstat 快很多。要只看某个端口:
ss -tlnp 'sport = :8080'
如果没有 PID 那一列,八成是权限不够——非 root 看不到别人的进程信息。
二、端口没人占,但就是绑不上
这种情况通常不是进程占用,而是 TIME_WAIT 或者端口落在内核保留区间里。检查:
cat /proc/sys/net/ipv4/ip_local_port_range
如果目标端口正好在这个区间内,出站连接会用掉它,偶发冲突。把服务换个端口,或者把这个区间调小,比死磕简单。
三、被 docker 或 iptables 挡住
ss 看不到不代表没冲突。docker 的 -p 8080:80 是通过 docker-proxy 和 iptables 转发的,偶尔会留下孤儿规则:
iptables -t nat -S | grep 8080
看到 DNAT 指向一个已经不存在的容器,删掉那条规则再起服务就行。
小结
先 ss,再看内核参数,最后查 iptables。九成的“端口占用”问题三分钟内能定位。