Linux 查看端口被哪个进程占用用 ss 不用 netstat
Linux 查看端口被哪个进程占用:用 ss 不用 netstat
为什么推荐使用 ss 而不是 netstat
netstat 曾经是网络排错的标配工具,但随着 Linux 内核网络子系统的演进,它已逐渐被 ss(Socket Statistics)取代。主要原因包括:
- 速度更快:
ss直接从内核获取套接字信息,而netstat需要读取/proc下的文件,当连接数庞大时性能差异显著。 - 原生支持新特性:
ss属于iproute2工具集,能完美展示内核新引入的套接字状态和 TCP 信息(如 TCP 定时器详情),而netstat基于较老的/proc/net/tcp接口,信息有限。 - 官方建议:许多现代发行版(如 RHEL/CentOS 7+、Debian/Ubuntu 较新版本)已将
netstat标记为弃用,并推荐迁移至ss。
因此,当你需要排查端口占用问题时,学会使用 ss 已经成为必备技能。本教程将带你从零开始掌握这一高效工具。
准备工作
几乎所有主流 Linux 发行版都预装了 iproute2 软件包,其中包含 ss 命令。你可以通过以下方式确认:
which ss # 通常会输出 /usr/sbin/ss 或 /bin/ss
如果未安装(极少情况),使用包管理器安装 iproute2:
- Debian/Ubuntu:
sudo apt install iproute2 - RHEL/CentOS:
sudo yum install iproute(包名可能略有不同)
重要提示:要查看端口所属的进程名称或 PID,通常需要 root 权限(使用 sudo)。普通用户执行 ss -p 时,进程列可能显示为 - 或空。
核心命令:一次性查看所有监听端口及其进程
最常用的场景是找出当前系统上所有正在监听的 TCP/UDP 端口,并显示占用它们的进程。运行以下命令即可:
sudo ss -tulpn
选项解释(你可以按需组合):
-t:显示 TCP 套接字-u:显示 UDP 套接字-l:仅显示处于 LISTEN(监听)状态的套接字-p:显示使用该套接字的进程信息(需要 root)-n:以数字形式显示端口号,而非服务名称(避免 DNS 解析延迟,推荐始终加-n)
如果不加 -n,你会看到类似 http、ssh 这样的服务名,而非 80、22。在排错时,使用数字更直接。
实战演练:解读输出
执行 sudo ss -tulpn 后,典型输出如下:
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1072,fd=3))
tcp LISTEN 0 128 [::]:80 [::]:* users:(("nginx",pid=1543,fd=6),("nginx",pid=1542,fd=6))
udp UNCONN 0 0 127.0.0.53%lo:53 0.0.0.0:* users:(("systemd-resolve",pid=587,fd=12))
关键字段说明:
- Netid:协议类型(tcp/udp)
- State:连接状态,
LISTEN表示正在监听,UNCONN表示 UDP 未连接状态 - Local Address:Port:本地监听的地址和端口。
0.0.0.0:22表示在所有 IPv4 接口上监听 22 端口;[::]:80表示在所有 IPv6 接口上监听 80 端口 - Process:括在
users:(())中的内容,包含进程名、PID 和文件描述符。如上例中 PID 1543 的 nginx 进程正在监听 80 端口
查看特定端口是否被占用
如果你只关心某个端口(比如 8080),可以组合 grep 过滤:
sudo ss -tulpn | grep :8080
输出示例:
tcp LISTEN 0 128 0.0.0.0:8080 0.0.0.0:* users:(("java",pid=2345,fd=42))
若没有任何输出,说明该端口当前未被占用。
进阶用法:查看所有 TCP 连接(不仅仅是监听)
如果你想查看所有 TCP 连接(包括已建立连接、关闭等待等状态),去掉 -l 选项:
sudo ss -tupn
这会列出所有 TCP 和 UDP 套接字。输出中 State 列可能出现 ESTAB、TIME-WAIT、CLOSE-WAIT 等状态。配合 -p 依然可以显示进程。
获取更精细的进程信息
有时一个进程可能占用多个端口,你希望看到进程的完整命令行,而不只是进程名。ss 本身不能直接显示完整命令,但你可以拿到 PID 后结合 ps 查看:
sudo ss -tulpn | grep :3000
# 假设输出显示 PID 为 1234
ps -fp 1234
或者一行搞定:
sudo ss -tulpn | awk '/:3000/{print $7}' | sed 's/.*pid=\([0-9]*\).*/\1/' | xargs ps -f
常见问题
1. 运行 ss -p 提示进程信息为空或显示 -
权限不足。请尝试 sudo ss -p 或切换到 root 执行。普通用户无法访问其他进程的套接字信息。
2. 输出中端口显示为服务名(如 http)而非数字
默认不解析端口为服务名可能会加速命令。建议始终使用 -n 选项。
3. 想查看监听端口的 IPv4 和 IPv6 详细信息
默认情况下 ss 会同时显示 IPv4 和 IPv6 套接字。你可以通过 -4 仅显示 IPv4,-6 仅显示 IPv6。例如:
sudo ss -tulpn -4
小结
- 忘掉
netstat,拥抱ss:更快、更现代、信息更全。 - 查看端口占用万能命令:
sudo ss -tulpn - 配合
grep快速定位特定端口。 - 不加
-l可观察所有连接状态,便于深度排查连接问题。
掌握这些 ss 用法后,你就能在 Linux 上高效地解决“哪个进程占用了端口”这类日常问题了。