端口排查四剑客:ss、lsof、fuser、netstat 实战

好,咱们进入第四章节。前面聊了端口是什么、怎么被占用的,现在该动真格的了——上工具。

Linux 下排查端口,说白了就四个命令:ss、lsof、fuser、netstat。我个人的习惯是,先 ss,再 lsof,最后 fuser 收尾。为什么这么排?往下看你就明白了。

核心原则:别死记硬背参数,理解每个工具「擅长干什么」。ss 看状态、lsof 查进程、fuser 杀占用,各司其职。

端口排查四剑客知识体系 端口占用排查 ss 命令 现代替代品,速度快 lsof 命令 查进程与文件句柄 fuser 命令 直接杀占用进程 netstat 命令 经典工具,逐渐淘汰 实战选择建议 • 新系统优先用 ss(性能好,内核直接读) • 需要查文件句柄或进程详情用 lsof • 确定要杀进程时用 fuser -k,一步到位

4.1 ss 命令:现代端口的「快照相机」

ss 是 socket statistics 的缩写。它直接从内核的 socket 信息中读取数据,比 netstat 快一个数量级。我在排查高并发服务器时,netstat 经常卡住,ss 几乎秒出。

最常用的组合是:

# 查看所有监听中的 TCP 端口
ss -tlnp

# 查看所有端口(包括已连接)
ss -tanp

# 只看某个端口
ss -tlnp | grep 8080

参数拆解一下:

参数 含义 我的备注
-t 只显示 TCP UDP 用 -u
-l 只显示 LISTEN 状态 不加的话会显示所有连接
-n 不解析服务名 显示数字端口,更快
-p 显示进程信息 需要 root 权限

小技巧:我习惯把 ss -tlnp 设成别名 ports。每次上服务器先敲一下,心里就有数了。

4.2 lsof 命令:进程的「显微镜」

lsof 全称 list open files。Linux 里「一切皆文件」,socket 也是文件。所以查端口就是查文件。

我最常用的场景:

# 查看哪个进程占用了 3306 端口
lsof -i :3306

# 查看某个进程打开了哪些端口
lsof -i -p 1234

# 只看 TCP 监听
lsof -iTCP -sTCP:LISTEN

输出示例:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
mysqld   1234  mysql   12u  IPv4  54321      0t0  TCP *:3306 (LISTEN)

这里有个坑——lsof 在 /proc 文件系统压力大时会变慢。我曾经在容器环境下用 lsof,结果卡了十几秒。后来发现是 /proc 挂载有问题。

注意:lsof 需要 root 权限才能看到所有进程的信息。普通用户只能看到自己的进程。

4.3 fuser 命令:端口的「终结者」

fuser 这个工具,说白了就是「找到谁在用,然后干掉它」。我特别喜欢它的 -k 参数。

# 查看 8080 端口被谁占用
fuser 8080/tcp

# 直接杀掉占用 8080 的进程
fuser -k 8080/tcp

# 杀掉前先问问(安全模式)
fuser -k -i 8080/tcp

输出格式很简单:

8080/tcp:            12345  12346

冒号后面就是进程 PID。多个 PID 用空格隔开。

我曾经踩过的坑:有一次在生产环境用 fuser -k 80/tcp,结果把 nginx 主进程和所有 worker 进程全杀了。嗯,那会儿网站直接挂了。所以我现在都会先用 -i 参数确认一下。

实战建议:fuser 适合「我知道这个端口被占了,我要立刻释放它」的场景。但别在没确认进程身份前乱用 -k。

4.4 netstat 命令:老将出马

netstat 是经典工具,但现在已经逐渐被 ss 取代了。不过很多老系统上还是只有它。

# 经典组合
netstat -tunlp

# 参数说明
# -t TCP
# -u UDP
# -n 数字显示
# -l 只显示监听
# -p 显示进程

输出示例:

Proto Recv-Q Send-Q Local Address   Foreign Address  State       PID/Program name
tcp        0      0 0.0.0.0:22      0.0.0.0:*        LISTEN      1234/sshd
tcp        0      0 0.0.0.0:3306    0.0.0.0:*        LISTEN      5678/mysqld

我的建议:如果你还在用 CentOS 6 或更老的系统,netstat 是标配。新系统直接上 ss 吧,少装一个包就少一个依赖。

4.5 四选一:到底用哪个?

我整理了一个对比表,方便你快速决策:

场景 推荐工具 理由
快速查看所有监听端口 ss -tlnp 速度最快,信息最全
查某个端口被哪个进程占用 lsof -i :端口 输出直观,包含文件描述符
确定要杀掉占用进程 fuser -k 端口/tcp 一步到位,不用二次 grep
老系统兼容性排查 netstat -tunlp 几乎所有 Linux 都预装

说白了,这四个工具不是互斥的,而是互补的。我自己的排查流程通常是:

  1. 先用 ss 扫一眼,看看端口是不是真的在监听
  2. 再用 lsof 确认,是哪个进程、哪个用户
  3. 最后用 fuser 收尾,如果需要释放端口的话

netstat 嘛,我只有在 ssh 到一台老机器时才会想起它。

一句话总结:ss 看状态,lsof 查详情,fuser 做清理,netstat 保兼容。记住这个口诀,端口排查不再慌。