linux 查看端口占用(长文讲解)

更新时间:

💡一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

截止目前, 星球 内专栏累计输出 90w+ 字,讲解图 3441+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 3100+ 小伙伴加入学习 ,欢迎点击围观

前言

在 Linux 系统中,端口是网络通信的“门”,不同的服务(如 Web 服务器、数据库、API 等)会通过端口与外部交互。当遇到服务无法启动、连接被拒绝等问题时,排查端口占用情况是常见的解决方案。然而,对于编程初学者或中级开发者来说,如何高效、准确地查看端口占用可能显得有些复杂。本文将从零开始,逐步讲解 Linux 中常用的工具和命令,结合实际案例,帮助读者掌握这一技能。


netstat:端口检测的“瑞士军刀”

基础语法与核心参数

netstat 是 Linux 系统中经典的网络状态监控工具,功能全面且易于上手。其核心命令格式为:

netstat [参数]  

以下是最常用的参数组合:

  • -t:显示 TCP 端口
  • -u:显示 UDP 端口
  • -n:以数字形式显示端口号(而非服务名)
  • -l:仅列出监听(listening)的端口
  • -p:显示关联的进程 PID 和名称

示例 1:查看所有监听的 TCP 端口

netstat -tuln  

此命令会列出系统中所有处于监听状态的 TCP 端口及其 IP 地址。例如,若输出中出现 0.0.0.0:80,则表示 HTTP 服务正在运行。

示例 2:结合 grep 精准定位端口

netstat -tunlp | grep ':8080'  

通过 grep 过滤,可快速找到占用 8080 端口的进程。

类比理解:端口如同“房间的门”

将端口想象成一栋大楼的门:每个门(端口)对应不同的功能(服务),而进程是“守门人”。netstat 就像保安系统,能告诉你哪些门被占用,以及由谁负责。


lsof:进程与端口的“关联图谱”

命令核心与使用场景

lsof(List Open Files)不仅能查看端口占用,还能列出进程打开的所有文件、网络连接等资源。其核心语法为:

lsof [参数] [条件]  

常用参数包括:

  • -i:过滤网络相关的资源
  • -P:显示端口号而非服务名
  • -n:禁用域名解析(加快速度)
  • -s:指定协议和状态(如 TCP:LISTEN

示例 3:查找占用特定端口的进程

sudo lsof -i :3306  

此命令会返回占用 3306 端口的进程信息(如 MySQL 服务)。若无权限,需加 sudo

进阶技巧:多条件组合查询

sudo lsof -i -P -n | grep LISTEN  

此命令结合了三个参数:

  1. -i:过滤网络连接
  2. -P:显示端口号
  3. -n:跳过 DNS 解析
    通过 grep LISTEN 进一步筛选出监听状态的端口,适合全局排查。

ss:新一代网络工具的“速度之王”

与 netstat 的对比

ss(Socket Statistics)是 netstat 的替代工具,性能更高,尤其在处理大量连接时优势显著。其语法与 netstat 类似,但参数更简洁:

  • ss -tuln 等效于 netstat -tuln

示例 4:查看所有 TCP 端口状态

ss -t -a  

此命令列出所有 TCP 连接的状态(如 ESTABLISHEDTIME-WAIT 等),帮助分析网络拥堵问题。

类比:ss 是“高速摄像机”

如果说 netstat 是普通相机,ss 则是高速摄像机——它能更快地“捕捉”到端口的实时状态,尤其适合高负载环境。


实战案例:解决端口冲突问题

场景描述

假设你尝试启动一个 Web 服务(如 Nginx),但提示端口 80 已被占用:

nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)  

此时需定位占用端口的进程并处理。

步骤 1:使用 netstatlsof 定位

sudo lsof -i :80  
sudo netstat -tulnp | grep ':80'  

假设输出显示进程 httpd(Apache)占用了该端口:

COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME  
httpd    1234  root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)  

步骤 2:终止进程或调整配置

方法 1:强制终止进程

sudo kill -9 1234  

但需谨慎操作,避免影响其他服务。

方法 2:修改端口配置

编辑服务配置文件(如 Apache 的 httpd.conf),将端口改为 8080,重启服务即可避免冲突。


注意事项与常见问题

权限问题

某些命令(如 lsof)需要管理员权限。若提示 Permission denied,请添加 sudo

端口占用的隐藏因素

  • 防火墙规则:即使端口未被占用,防火墙(如 iptablesufw)也可能阻止连接。
  • 容器与虚拟机:Docker 或 VM 中的进程可能占用宿主机端口,需检查容器配置。

工具选择建议

场景推荐工具原因
快速排查端口占用lsof输出直观,支持进程名称
性能监控与分析ss高效处理大规模连接
兼容性要求高(旧系统)netstat广泛支持,语法熟悉

结论

掌握 Linux 端口查看技巧,是开发与运维工作中不可或缺的基础能力。通过 netstat 的全面性、lsof 的关联性、ss 的高效性,开发者可以快速定位问题、优化服务配置。无论是调试本地开发环境,还是排查生产服务器故障,这些工具都能成为你的“网络故障诊断利器”。

建议读者通过实际操作加深理解:尝试用不同命令检查本地端口,模拟端口冲突场景,并学习优雅地处理冲突(如调整配置而非直接杀进程)。随着经验积累,这些技能将成为你技术栈中的坚实基础。

最新发布