在Linux系统中,端口是应用程序与网络通信的入口,查看端口占用情况是系统管理和故障排查中的常见需求,当某个服务无法启动时,可能是端口被其他进程占用;当排查网络问题时,需要确认特定端口是否处于监听状态,本文将详细介绍Linux系统中查看端口占用的多种方法,包括命令工具的使用、参数解析及输出解读,帮助用户高效定位端口相关信息。

使用netstat命令查看端口占用
netstat是Linux系统中传统的网络工具,用于显示网络连接、路由表、接口统计等信息,虽然在新版系统中逐渐被ss替代,但在一些老系统或兼容场景中仍被广泛使用。
基本语法与常用参数
netstat命令的基本语法为netstat [选项],查看端口占用时常用以下参数组合:
-t:显示TCP端口-u:显示UDP端口-l:仅显示监听端口(即等待连接的端口)-n:以数字形式显示地址和端口,不解析域名和服务名(加快查询速度)-p:显示占用端口的进程ID(PID)和进程名(需root权限)
示例与输出解读
-
查看所有监听的TCP和UDP端口
netstat -tuln
输出示例:
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN udp 0 0 0.0.0.0:68 0.0.0.0:*Proto:协议类型(TCP/UDP)Local Address:本地IP地址和端口(0.0.0表示监听所有IP)State:端口状态(LISTEN表示监听状态)
-
查看监听端口并显示对应进程
sudo netstat -tulnp
输出示例(增加PID和进程名):
Active Internet connections (only servers) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1/sshd tcp 0 0 127.0.0.1:3306 0.0.0.0:* LISTEN 1234/mysqld通过
PID/Program name可快速定位占用端口的进程,如mysqld占用3306端口。 -
过滤特定端口
若需查看8080端口是否被占用,可结合grep过滤:netstat -tuln | grep 8080
使用ss命令查看端口占用(推荐)
ss是iproute2工具包中的命令,作为netstat的替代品,ss在查询速度和功能上更优,尤其是在处理大量网络连接时效率更高,现代Linux发行版(如Ubuntu、CentOS 7+)默认已安装。
基本语法与常用参数
ss命令的基本语法为ss [选项],常用参数包括:

-t:TCP端口-u:UDP端口-l:仅显示监听端口-n:数字形式显示,不解析域名-p:显示进程ID和进程名-e:显示详细信息(如TCP状态扩展)-4/-6:仅显示IPv4/IPv6端口
示例与输出解读
-
查看所有监听端口
ss -tuln
输出示例(与netstat类似,但格式更简洁):
State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 0.0.0.0:22 0.0.0.0:* LISTEN 0 50 127.0.0.1:3306 0.0.0.0:* -
显示监听端口及进程信息
sudo ss -tulnp
输出示例:
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process LISTEN 0 128 0.0.0.0:22 0.0.0.0:* users:(("sshd",pid=1,fd=3)) LISTEN 0 50 127.0.0.1:3306 0.0.0.0:* users:(("mysqld",pid=1234,fd=31))Process字段直接显示进程名和PID,比netstat更直观。 -
查看特定端口的占用情况
ss -tuln | grep 8080
或直接指定端口:
ss -tulpn 'sport = :8080'
使用lsof命令查看端口占用
lsof(list open files)用于列出系统中被打开的文件,在Linux中,一切皆文件,网络端口也被视为文件,因此可通过lsof查看端口占用情况。
基本语法
lsof -i:[端口号]
-i:指定网络连接[端口号]:可选,若不指定则显示所有网络连接
示例与输出解读
-
查看8080端口占用
sudo lsof -i:8080
输出示例:

COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME nginx 3456 root 6u IPv4 12345 0t0 TCP *:8080 (LISTEN) nginx 3457 www-data 6u IPv4 12345 0t0 TCP *:8080 (LISTEN)COMMAND:进程名(如nginx)PID:进程IDNAME:监听地址和端口
-
查看所有网络连接及端口
sudo lsof -i
使用nmap命令扫描本地端口
nmap(Network Mapper)是强大的网络扫描工具,通常用于扫描远程主机端口,但也可用于扫描本机端口占用情况,需先安装nmap(sudo apt install nmap或sudo yum install nmap)。
基本语法
nmap -sT -O localhost
-sT:TCP连接扫描(非root用户可用)-O:检测操作系统信息localhost:扫描本地主机
示例与输出解读
nmap -sT -p 1-1024 localhost
输出示例(部分):
Starting Nmap 7.80 ( https://nmap.org ) at 2023-10-01 10:00 CST
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000010s latency).
Not shown: 997 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
PORT:端口号STATE:状态(open表示端口开放,即被占用)
结合systemctl查看服务与端口关联
对于通过systemd管理的服务(如nginx、mysql),可通过systemctl查看服务状态,间接确认端口占用情况。
示例
# 查看nginx服务状态 sudo systemctl status nginx
输出示例:
● nginx.service - A high performance web server and a reverse proxy server
Loaded: loaded (/usr/lib/systemd/system/nginx.service; enabled; vendor preset: disabled)
Active: active (running) since Mon 2023-10-01 09:30:00 CST; 1h 30min ago
Docs: man:nginx(8)
Main PID: 3456 (nginx)
Tasks: 2 (limit: 1149)
Memory: 5.5M
CGroup: /system.slice/nginx.service
├─3456 nginx: master process /usr/sbin/nginx -c /etc/nginx/nginx.conf
└─3457 nginx: worker process
通过Main PID可获取进程ID,再结合ss或lsof查看端口:
sudo ss -tulnp | grep 3456
工具对比与选择
| 工具 | 核心命令 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| netstat | netstat -tulnp |
兼容性好,老系统必备 | 效率低,输出格式较旧 | 传统系统、简单查询 |
| ss | ss -tulnp |
速度快,信息丰富,推荐 | 部分老系统未预装 | 现代Linux系统首选 |
| lsof | lsof -i:端口号 |
可查文件句柄,适合复杂场景 | 命令较长,需root权限 | 深度排查、文件关联查询 |
| nmap | nmap -p 端口号 localhost |
功能强大,可扫描远程 | 需安装,扫描速度较慢 | 网络扫描、本地端口验证 |
| systemctl | systemctl status 服务名 |
关联服务,管理便捷 | 需知道服务名 | 服务管理场景 |
查看Linux端口占用的方法多样,推荐优先使用ss命令,其高效性和信息丰富性能满足大部分需求;若需兼容老系统,netstat仍是可靠选择;lsof适合深度排查文件句柄关联问题;nmap则更适合网络扫描场景,通过结合进程管理命令(如kill、systemctl),可进一步解决端口冲突问题,确保系统服务正常运行。
相关问答FAQs
Q1: 如何终止占用端口的进程?
A: 若需终止占用端口的进程,可通过进程ID(PID)或进程名操作,首先通过ss -tulnp或netstat -tulnp找到PID,然后使用kill PID正常终止进程(如kill 1234);若进程无响应,可强制终止kill -9 PID,通过进程名终止则使用killall 进程名(如killall nginx),注意:终止关键进程可能导致服务异常,操作前需确认进程安全性。
Q2: 端口被占用但找不到对应进程怎么办?
A: 可能原因包括:① 进程已结束但端口未释放(TIME_WAIT状态),可等待或调整内核参数(如net.ipv4.tcp_tw_reuse=1);② 进程以root权限运行,普通用户无法查看,需使用sudo执行命令;③ 容器或虚拟机端口映射冲突,检查容器配置(如Docker的-p参数)或虚拟机网络设置;④ 内核模块占用,可通过dmesg | grep 端口号查看内核日志,若仍无法解决,尝试重启相关服务或系统释放端口。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/32411.html