端口排查四剑客:ss、lsof、fuser、netstat 实战
好,咱们进入第四章节。前面聊了端口是什么、怎么被占用的,现在该动真格的了——上工具。
Linux 下排查端口,说白了就四个命令:ss、lsof、fuser、netstat。我个人的习惯是,先 ss,再 lsof,最后 fuser 收尾。为什么这么排?往下看你就明白了。
核心原则:别死记硬背参数,理解每个工具「擅长干什么」。ss 看状态、lsof 查进程、fuser 杀占用,各司其职。
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 都预装 |
说白了,这四个工具不是互斥的,而是互补的。我自己的排查流程通常是:
- 先用 ss 扫一眼,看看端口是不是真的在监听
- 再用 lsof 确认,是哪个进程、哪个用户
- 最后用 fuser 收尾,如果需要释放端口的话
netstat 嘛,我只有在 ssh 到一台老机器时才会想起它。
一句话总结:ss 看状态,lsof 查详情,fuser 做清理,netstat 保兼容。记住这个口诀,端口排查不再慌。