linux 查看端口占用(长文讲解)
💡一则或许对你有用的小广告
欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论
- 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于
Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...
,点击查看项目介绍 ;演示链接: http://116.62.199.48:7070 ;- 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;
截止目前, 星球 内专栏累计输出 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
此命令结合了三个参数:
-i
:过滤网络连接-P
:显示端口号-n
:跳过 DNS 解析
通过grep LISTEN
进一步筛选出监听状态的端口,适合全局排查。
ss:新一代网络工具的“速度之王”
与 netstat 的对比
ss
(Socket Statistics)是 netstat
的替代工具,性能更高,尤其在处理大量连接时优势显著。其语法与 netstat
类似,但参数更简洁:
ss -tuln
等效于netstat -tuln
示例 4:查看所有 TCP 端口状态
ss -t -a
此命令列出所有 TCP 连接的状态(如 ESTABLISHED
、TIME-WAIT
等),帮助分析网络拥堵问题。
类比:ss 是“高速摄像机”
如果说 netstat
是普通相机,ss
则是高速摄像机——它能更快地“捕捉”到端口的实时状态,尤其适合高负载环境。
实战案例:解决端口冲突问题
场景描述
假设你尝试启动一个 Web 服务(如 Nginx),但提示端口 80 已被占用:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
此时需定位占用端口的进程并处理。
步骤 1:使用 netstat
或 lsof
定位
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
。
端口占用的隐藏因素
- 防火墙规则:即使端口未被占用,防火墙(如
iptables
或ufw
)也可能阻止连接。 - 容器与虚拟机:Docker 或 VM 中的进程可能占用宿主机端口,需检查容器配置。
工具选择建议
场景 | 推荐工具 | 原因 |
---|---|---|
快速排查端口占用 | lsof | 输出直观,支持进程名称 |
性能监控与分析 | ss | 高效处理大规模连接 |
兼容性要求高(旧系统) | netstat | 广泛支持,语法熟悉 |
结论
掌握 Linux 端口查看技巧,是开发与运维工作中不可或缺的基础能力。通过 netstat
的全面性、lsof
的关联性、ss
的高效性,开发者可以快速定位问题、优化服务配置。无论是调试本地开发环境,还是排查生产服务器故障,这些工具都能成为你的“网络故障诊断利器”。
建议读者通过实际操作加深理解:尝试用不同命令检查本地端口,模拟端口冲突场景,并学习优雅地处理冲突(如调整配置而非直接杀进程)。随着经验积累,这些技能将成为你技术栈中的坚实基础。