服务器测评网
我们一直在努力

Linux查看进程占用的端口?查看端口占用用什么命令?

在 Linux 系统运维与网络故障排查中,快速准确地定位进程与其监听端口的映射关系是核心技能。最推荐且高效的方式是使用 ss 命令,它直接从内核读取数据,执行速度远超传统工具;其次是经典的 netstat 和功能全面的 lsof,掌握这三把“利剑”,并结合 grep 进行过滤,能够解决绝大多数端口占用与进程归属的排查需求。

Linux查看进程占用的端口?查看端口占用用什么命令?

首选方案:使用 ss 命令(现代标准)

ss(Socket Statistics)是 iproute2 套件的一部分,用于替代过时的 netstat,它能够显示比 netstat 更详细的 TCP 和状态信息,且不需要解析 /proc 文件系统,因此在高并发服务器上性能极佳。

查看所有监听端口
要查看当前系统所有正在监听(Listening)的 TCP 和 UDP 端口,可以使用以下命令:

ss -tuln

参数解析:

  • -t:显示 TCP 套接字。
  • -u:显示 UDP 套接字。
  • -l:仅显示监听状态的套接字。
  • -n:以数字形式显示端口号,不解析服务名称(解析服务名会稍微增加延迟,且在排查时不如数字直观)。

查看端口对应的进程(核心用法)
仅仅知道端口被占用是不够的,必须知道是哪个进程占用的,此时需要加上 -p 参数:

sudo ss -tulnp
  • -p:显示使用套接字的进程名称和 PID(Process ID)。
  • 注意:由于涉及进程信息的读取,普通用户执行时可能无法看到进程名,因此必须加 sudo

针对特定端口的精准查询
在实际运维中,我们通常只关注某一个特定端口(80 端口),结合 grep 命令是最高效的做法:

sudo ss -tulnp | grep :80

此命令将直接输出占用 80 端口的进程名(如 nginx)及其 PID。

经典方案:使用 netstat 命令(兼容性强)

尽管 ss 已经成为主流,但 netstat 属于 net-tools 工具包,在很多旧版本的 Linux 系统(如 CentOS 6)或习惯性脚本中依然广泛存在,对于运维人员来说,熟悉 netstat 依然是必要的。

查看所有监听端口及进程
ss 类似,查看监听端口并显示进程信息的命令如下:

sudo netstat -tulnp

参数含义与 ss 基本一致,-p 同样需要 root 权限才能显示进程名。

查找特定端口

sudo netstat -tulnp | grep :3306

这常用于快速确认 MySQL 数据库是否正常启动并监听在默认端口。

Linux查看进程占用的端口?查看端口占用用什么命令?

性能差异说明
虽然 netstat 功能完备,但它是通过读取 /proc 文件系统来获取信息的,当系统连接数非常大(如数万并发)时,netstat 的执行速度会明显变慢,甚至阻塞终端,在现代高性能服务器上,应优先使用 ss

详细方案:使用 lsof 命令(信息最全)

lsof(List Open Files)是一个功能极其强大的工具,在 Linux 中“一切皆文件”,网络套接字也被视为文件。lsof 不仅能查看端口,还能查看该进程打开的所有其他文件描述符。

根据端口查找进程
这是 lsof 最常用的场景,语法非常直观:

sudo lsof -i :80
  • -i:显示网络连接。
  • 80:指定端口号 80。

该命令会列出详细的列信息,包括 COMMAND(进程名)、PID(进程ID)、USER(运行用户)、TYPE(协议类型)等。

根据 PID 查找端口(反向查询)
有时我们已知一个异常的 PID(例如通过 top 命令发现 CPU 占用过高),想知道它在对外通信时使用了哪些端口:

sudo lsof -p [PID] -a -i
  • -p [PID]:指定进程 ID。
  • -a:表示逻辑“与”运算,将条件组合。
  • -i:显示网络文件。

快速杀戮方案:使用 fuser 命令

在排查端口冲突时,如果发现某个端口被非法或无用进程占用,需要立即释放端口,fuser 是最快的工具,它能直接查找并操作占用端口的进程。

查找占用端口的进程

fuser 80/tcp

执行后,会输出占用该端口的 PID。

查找并直接终止进程
加上 -k 参数可以直接杀掉占用端口的进程:

sudo fuser -k 80/tcp

注意:这是一个具有破坏性的操作,会强制结束进程,请务必确认该进程可以被终止后再执行。

高级排查与容器环境下的注意事项

在复杂的运维环境中,简单的命令可能无法满足需求,需要结合系统原理进行深度排查。

Linux查看进程占用的端口?查看端口占用用什么命令?

权限问题
如果执行 ss -pnetstat -p 时只能看到端口,却显示 PID/Program name 为 “-“,这通常是因为当前用户权限不足。必须使用 sudo 提升权限,因为这些工具需要访问内核网络栈的详细元数据。

容器环境(Docker/Kubernetes)
在容器化环境中,在宿主机上执行 ssnetstat 通常只能看到宿主机的端口映射情况,如果容器使用了 host 网络模式,则可以直接看到容器内的进程端口,如果是 bridge 模式,往往需要结合 docker ps 查看端口映射表,或者进入容器内部执行 ss 命令。
如果需要在宿主机上精准定位容器内的进程,可以使用 pidofps aux | grep 找到容器的进程 PID(在宿主机上可见),再使用 lsof -p PID 查看其占用的端口。

端口复用(SO_REUSEPORT)
现代高性能服务(如 Nginx、Node.js)常启用 SO_REUSEPORT 选项,允许多个进程监听同一个端口以提高吞吐量,此时使用 ss 查看时,可能会看到同一个端口对应了多个 PID,这是正常现象,并非端口冲突。

归纳与最佳实践

在 Linux 系统中查看进程占用端口,应遵循以下原则以获得最佳体验:

  1. 日常首选:使用 sudo ss -tulnp,速度快,信息准。
  2. 精准定位:使用 sudo ss -tulnp | grep :端口号
  3. 深度分析:使用 sudo lsof -i :端口号 获取更详细的上下文信息。
  4. 紧急处理:使用 sudo fuser -k 端口/tcp 快速释放端口。

通过灵活组合这些命令,运维人员可以迅速定位网络故障点,区分是服务未启动、端口被占用还是防火墙拦截问题,从而保障系统的稳定运行。


相关问答

Q1:在 Linux 中查看端口时,netstatss 命令显示的 Recv-Q 和 Send-Q 代表什么?
A: 这两个参数代表了网络队列中的数据量,对于排查网络拥塞非常有用。

  • Recv-Q(接收队列): 表示网络收到的数据已在本地接收缓冲区,但还没有被应用程序读取的字节数,如果这个值持续很高,说明应用程序处理数据的速度跟不上网络接收的速度,可能存在应用性能瓶颈。
  • Send-Q(发送队列): 表示本地已发送但未收到远程 TCP 确认(ACK)的字节数,如果这个值持续很高,说明网络拥塞或对端处理能力不足,导致数据堆积在发送缓冲区。

Q2:为什么我使用 netstatss 看不到某个进程的端口,但服务明明在运行?
A: 这种情况通常由以下三个原因导致:

  1. 权限不足: 最常见的原因,普通用户无法查看其他用户(特别是 root)运行的进程详情,请尝试加上 sudo
  2. 协议类型错误: 如果服务监听的是 UDP 端口,而你只查看了 TCP(-t),就会找不到,请确保使用 -u 参数或同时使用 -tu
  3. 监听地址限制: 服务可能只监听在 0.0.1(本地回环)上,外部无法连接,但本地可以查到,或者服务运行在容器内部,在宿主机的网络命名空间中是看不到该端口的。

互动环节:
你在日常运维中是否遇到过端口被莫名占用的情况?你是如何快速排查并解决的?欢迎在评论区分享你的实战经验和独门技巧!

赞(0)
未经允许不得转载:好主机测评网 » Linux查看进程占用的端口?查看端口占用用什么命令?