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

Linux怎么查看端口占用,如何根据端口号查进程?

在Linux运维与开发过程中,快速定位占用特定端口的进程是解决服务冲突、排查网络故障的核心技能。查看占用端口的进程最推荐使用 ss 命令,它是现代Linux内核环境下最高效的工具;传统的 netstatlsof 命令同样有效,但在性能上略逊一筹,掌握这三者的用法,能够帮助管理员在秒级时间内完成端口占用情况的诊断,从而迅速决定是释放端口还是调整服务配置。

Linux怎么查看端口占用,如何根据端口号查进程?

使用 ss 命令高效查询端口占用

ss(Socket Statistics)是 netstat 的替代品,用于获取套接字统计信息,它直接从内核空间读取数据,而不是像 netstat 那样遍历 /proc 文件系统,因此在处理大量连接时速度极快,且默认包含在现代Linux发行版中。

要查看占用特定端口的进程,最常用的组合参数是 -tulnp,具体命令如下:

ss -tulnp | grep :<端口号>

参数详解:

  • -t:显示 TCP 协议的连接。
  • -u:显示 UDP 协议的连接。
  • -l:仅显示监听状态的套接字,如果不加此参数,会显示所有已建立的连接,干扰排查。
  • -n:以数字形式显示端口号和服务地址。禁止 DNS 解析,能显著提升查询速度,避免因域名解析卡顿。
  • -p:显示使用套接字的进程信息(PID 和进程名称)。注意:此参数通常需要 root 权限才能查看到具体的进程名,否则只能显示 “users:((“。

输出示例分析:
假设执行 ss -tulnp | grep :80,输出结果如下:
tcp LISTEN 0 128 *:80 *:* users:(("nginx",pid=1234,fd=6))
从结果中可以直观看到,80端口被进程名为 nginx、PID为 1234 的进程占用,这是排查 Web 服务无法启动(提示端口被占用)最快的方法。

使用 netstat 命令(传统兼容方案)

虽然 ss 已成为主流,但 netstat 依然存在于许多老旧的运维脚本和习惯中,它属于 net-tools 工具包,在新版的 CentOS、Debian 或 Ubuntu 中可能默认未安装,需要通过 yum install net-toolsapt install net-tools 安装。

查询端口占用的经典命令为:

netstat -tulnp | grep <端口号>

参数含义与 ss 基本一致-t (TCP)、-u (UDP)、-l (Listening)、-n (Numeric)、p (Program)。

专业建议: 在生产环境中,如果系统已支持 ss,应优先使用 ssnetstat 在高并发连接数(如数万并发)的服务器上执行非常缓慢,甚至可能导致终端卡死,因为它需要解析大量的 /proc 文本数据,但在一些快速临时的检查中,netstat 的输出格式对某些老用户来说可能更为熟悉。

Linux怎么查看端口占用,如何根据端口号查进程?

使用 lsof 命令(文件视角的查询)

lsof(List Open Files)是另一个强大的工具,在 Linux 哲学中,“一切皆文件”,网络端口也被视为文件。lsof 可以用来列出打开特定端口的进程。

使用方法如下:

lsof -i :<端口号>

参数解析:

  • -i:列出所有网络文件。
  • <端口号>:指定具体的端口号。

输出解读:
lsof 的输出非常详细,包含 COMMAND(命令名)、PID(进程ID)、USER(用户)、FD(文件描述符)、TYPE(类型)等信息。

nginx 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)

优势与局限: lsof 的优势在于信息全面,不仅能看到端口,还能看到文件描述符和协议类型,但其劣势也很明显:执行速度比 ss,且在某些精简的容器镜像或最小化安装系统中可能未预装。

端口占用后的处理与专业解决方案

发现端口被占用后,如何处理是体现运维专业度的关键,切忌直接执行暴力操作,应遵循“确认-决策-执行”的流程。

确认进程身份
通过上述命令获取 PID 后,使用 ps -fp <PID>ps aux | grep <PID> 查看进程的完整启动命令和启动时间,这有助于判断该进程是系统关键服务(如 sshd)、正常的业务服务,还是僵尸进程。

冲突解决策略

Linux怎么查看端口占用,如何根据端口号查进程?

  • 停止冲突进程。 如果确认占用端口的是遗留或错误进程,可以使用 kill <PID> 优雅停止,若无效,再使用 kill -9 <PID> 强制终止。
  • 修改新服务端口。 如果占用端口的进程是核心业务(80 端口已被 Nginx 占用),则应修改新上线服务的配置文件,将其监听端口改为其他(如 8080),避免破坏现有服务。
  • 端口复用(SO_REUSEPORT)。 对于高并发场景,Linux 内核支持 SO_REUSEPORT 选项,允许多个进程监听同一端口(如 Nginx 的多 Worker 模式),如果看到同一端口被多个同名进程占用,这通常是正常的负载均衡行为,无需干预。

权限问题处理
如果在执行 ss -plsof -i 时看不到进程名,只看到 或 cannot open,说明当前用户权限不足。必须使用 sudo 提权,因为查看其他用户的网络套接字属于敏感操作。

深度解析:为什么 ss 是最佳选择

从专业角度分析,ss 命令不仅仅是一个工具,它是 Linux 网络栈演进的一个缩影。netstat 通过读取 /proc/net/tcp 等伪文件来获取信息,这在连接数较少时没问题,但当服务器并发连接达到 10万、100万级别时,/proc 文件的解析会消耗大量的 CPU 和 I/O 资源,甚至导致查询本身成为系统瓶颈。

ss 利用 netlink 套接字直接与内核通信,获取的是第一手的二进制数据,无需文本解析。这种设计使得 ss 在高负载服务器上依然能瞬间返回结果,是现代 DevOps 和 SRE 工具箱中不可或缺的组件。ss 还支持更丰富的过滤条件(如状态过滤、源/目的 IP 过滤),能编写出更精准的监控脚本。

相关问答

Q1:在 Linux 中查看端口占用时,提示“Address already in use”但找不到进程,该怎么办?
A: 这种情况通常是因为 TCP 连接处于 TIME_WAIT 状态,虽然进程已经终止,但 Socket 没有立即释放,而是等待了 2MSL(最大报文生存时间),此时使用 ss -tulnp 可能看不到 LISTEN 状态的进程,但启动新服务依然报错。解决方案:可以在程序代码中设置 SO_REUSEADDR 选项,或者调整内核参数 net.ipv4.tcp_tw_reuse 允许将 TIME_WAIT sockets 重新用于新的 TCP 连接,从而快速复用端口。

Q2:如何查看远程服务器上占用端口最多的进程?
A: 可以结合 sssortuniq 命令进行统计分析,执行命令:ss -tulnp | awk '{print $6}' | sort | uniq -c | sort -nr,该命令会提取出进程信息列,统计每个进程占用的端口数量,并按降序排列,这有助于发现是否存在异常进程开启了大量监听端口,可能是被入侵或程序出现 Bug 导致的文件描述符泄漏。

希望这篇文章能帮助你更高效地管理 Linux 服务器端口,如果你在日常运维中遇到了特殊的端口冲突案例,欢迎在评论区分享你的解决思路。

赞(0)
未经允许不得转载:好主机测评网 » Linux怎么查看端口占用,如何根据端口号查进程?