Linux 查看端口被哪个进程占用用 ss 不用 netstat

FreeGuideOnline 最新 2026-07-05

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,你会看到类似 httpssh 这样的服务名,而非 8022。在排错时,使用数字更直接。

实战演练:解读输出

执行 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 列可能出现 ESTABTIME-WAITCLOSE-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 上高效地解决“哪个进程占用了端口”这类日常问题了。