查看端口占用 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 服务器默认使用 80 端口,若该端口被其他程序占用,网站将无法正常访问。本文将系统性地介绍 Linux 环境下查看端口占用的多种方法,并通过案例演示如何快速定位问题。
一、基础概念:端口与网络协议
1.1 端口的定义与作用
端口是操作系统为应用程序分配的逻辑编号,范围从 0 到 65535。类似快递员通过门牌号找到住户,网络数据包通过端口号找到对应的服务程序。例如:
- HTTP 服务默认使用 80 端口
- SSH 连接默认使用 22 端口
- 数据库 MySQL默认使用 3306 端口
1.2 协议类型:TCP 与 UDP
- TCP(传输控制协议):提供可靠、有序的数据传输,适合网页浏览、文件下载等场景。
- UDP(用户数据报协议):注重速度而非可靠性,常用于实时通信如视频通话、在线游戏。 比喻:TCP 像是快递公司,确保包裹准确到达;UDP 则像外卖员,快速送达但可能偶尔丢失。
二、核心工具与命令详解
2.1 netstat:老牌端口检测工具
netstat
是网络统计工具,支持查看端口、路由表、网络连接状态等。
基础语法
netstat [选项]
常用参数组合
参数 | 作用 |
---|---|
-t | 显示 TCP 端口 |
-u | 显示 UDP 端口 |
-l | 列出监听中的端口 |
-n | 显示数字形式的端口号和 IP 地址 |
-p | 显示关联进程的 PID 和名称 |
实战案例:查看所有监听的 TCP 端口
netstat -tuln
输出示例:
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp6 0 0 :::80 :::* LISTEN
解析:
Proto
:协议类型(tcp 或 udp)Local Address
:本地监听的 IP 和端口(0.0.0.0
表示所有网卡)State
:端口状态(LISTEN 表示正在监听)
扩展:结合进程信息
netstat -tulnp | grep 80
此命令可查看占用 80 端口的进程 PID 和名称,方便直接终止冲突进程。
2.2 ss:现代网络监控工具
ss
(Socket Statistics)是 netstat
的替代工具,性能更高且功能更强大。
基础语法
ss [选项]
参数对比
功能 | netstat 命令 | ss 命令 |
---|---|---|
查看所有 TCP 连接 | netstat -at | ss -ta |
查看监听的 UDP 端口 | netstat -ul | ss -ul |
显示进程信息 | netstat -p | ss -p |
实战案例:快速定位端口占用
ss -tulnp | grep 3306
输出示例:
tcp LISTEN 0 128 127.0.0.1:3306 *:* users:(("mysqld",pid=1234,fd=24))
解析:
users
字段直接显示进程名和 PID(如mysqld
的 PID 是 1234)
2.3 lsof:多功能文件与端口监控
lsof
(List Open Files)能查看进程打开的文件、网络连接及端口占用。
核心命令
lsof -i [端口号]
常见用法
-
查看特定端口占用
lsof -i :80
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME apache2 1234 root 6u IPv4 12345 0t0 TCP *:http (LISTEN)
其中
PID
为进程 ID,COMMAND
是进程名称。 -
过滤 TCP/UDP 协议
lsof -i :53@udp
此命令专门查看 UDP 协议占用 53 端口的进程(如 DNS 服务)。
2.4 nmap:网络扫描工具
nmap
(Network Mapper)主要用于网络发现和安全审计,也能快速检测开放端口。
基础语法
nmap [选项] <目标地址>
实战案例:扫描本机开放端口
nmap -p 1-65535 localhost
输出示例:
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
注意事项:扫描本地端口需权限,建议使用 sudo
。
三、进阶技巧与问题排查
3.1 终止占用端口的进程
当发现端口被无关进程占用时,可结合 kill
命令终止进程:
lsof -i :8080 | grep LISTEN
sudo kill -9 <PID>
3.2 自动化脚本:批量检测端口
编写脚本循环检查常用端口状态:
#!/bin/bash
for port in 22 80 443 3306; do
ss -tulnp | grep ":$port" && echo "Port $port is in use" || echo "Port $port is free"
done
3.3 典型场景:服务启动失败
假设启动 Nginx 时提示端口 80 被占用:
nginx: [emerg] bind() to 0.0.0.0:80 failed (98: Address already in use)
解决方案:
- 使用
lsof -i :80
查找占用进程 - 若为旧 Nginx 进程残留,执行
systemctl restart nginx
- 若为其他服务(如 Apache),调整配置文件的端口号
四、常见问题与解决方案
4.1 问题:命令未安装
某些系统默认未安装 net-tools
(包含 netstat
)或 nmap
:
sudo apt install net-tools # Debian/Ubuntu
sudo yum install net-tools # CentOS/RHEL
sudo apt install nmap # Debian/Ubuntu
sudo dnf install nmap # CentOS 8+
4.2 问题:权限不足
部分命令需要 root 权限才能显示进程详情:
sudo ss -tulnp
4.3 问题:端口显示为 0.0.0.0
表示该端口监听所有网络接口,可正常访问。若需绑定特定 IP,修改服务配置文件的 Listen
参数。
五、结论与建议
通过本文介绍的 netstat
、ss
、lsof
、nmap
等工具,开发者和运维人员能够快速定位 Linux 系统中的端口占用问题。建议:
- 定期监控关键端口:如 Web 服务的 80/443 端口、数据库的 3306 端口
- 善用组合命令:结合
grep
、awk
筛选信息 - 记录常见端口号:避免重复查找标准服务的端口配置
掌握这些技能后,当遇到“端口被占用”时,便能像侦探一样通过系统工具层层排查,迅速解决问题。后续可进一步学习 firewalld
或 iptables
,深入理解防火墙规则对端口的影响。