在Linux系统中,端口是进程与网络通信的桥梁,当需要排查服务异常、解决端口冲突或监控网络连接时,查看进程占用的端口是常见需求,本文将详细介绍多种查看进程占用端口的方法,涵盖传统工具、现代高效工具及底层文件系统操作,并结合实际场景说明使用技巧。

使用netstat命令查看端口占用(传统方法)
netstat是Linux中经典的网络工具,功能全面,适用于各种发行版,但查询速度在高连接数场景下较慢,其核心是通过解析/proc文件系统和内核信息,输出网络连接状态、端口绑定情况等。
基本用法与参数
-
查看所有监听端口:
netstat -tuln
参数说明:
-t显示TCP端口,-u显示UDP端口,-l仅显示监听状态,-n以数字形式显示地址和端口(不解析域名和服务名)。
输出示例:Proto Recv-Q Send-Q Local Address State PID/Program name tcp 0 0 0.0.0.0:22 LISTEN 1234/sshd tcp6 0 0 :::8080 LISTEN 5678/java udp 0 0 0.0.0.0:68 LISTEN 9100/dhclient其中
Local Address列的IP:端口表示绑定的地址和端口,State为LISTEN表示进程正在监听该端口,PID/Program name为进程ID和进程名(需配合-p参数)。 -
显示进程ID和名称:
netstat -tulnp
添加
-p参数后,输出会包含PID/Program name列,可直接定位占用端口的进程,若发现8080端口被java进程占用,可通过PID进一步查询进程详情(如ps -ef | grep 5678)。 -
查看所有连接状态:
netstat -an
不加
-l和-p时,会显示所有连接(包括监听、已连接、TIME_WAIT等状态),结合grep可过滤特定端口:netstat -an | grep ':8080'
局限性
netstat在CentOS 7+、Ubuntu 18.04+等新发行版中逐渐被ss替代,且查询速度较慢,不适合高并发场景。
使用ss命令查看端口占用(现代高效工具)
ss是iproute2工具包的一部分,专为替代netstat设计,查询速度更快(直接从内核获取网络信息),功能更强大,是当前Linux系统推荐的首选工具。
基本用法与参数
-
查看所有监听端口:
ss -tuln
参数与
netstat类似:-t(TCP)、-u(UDP)、-l(监听)、-n(数字形式),输出格式更简洁,默认显示Netid(网络协议)、State(状态)、Local Address:Port(本地地址和端口)、Peer Address:Port(对端地址和端口)。 -
显示进程信息:
ss -tulnp
添加
-p参数后,输出包含Process列(格式为PID/Program name),
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:* 1234/sshd tcp LISTEN 0 50 [::]:8080 [::]:* 5678/java -
按状态或协议过滤:
查看所有TCP连接:ss -t
查看所有UDP连接:ss -u
查看处于ESTABLISHED状态的连接:ss -state ESTABLISHED
查看监听80端口的TCP连接:ss -tlnp | grep ':80'
优势
相比netstat,ss在处理大量连接时速度显著更快(例如数万连接场景下,ss耗时可能是netstat的1/10),且支持更丰富的过滤条件(如按state、type、sport等过滤),适合生产环境使用。
使用lsof命令查看端口占用(功能强大的文件工具)
lsof(list open files)是Linux中用于列出进程打开文件的工具,不仅限于网络端口,还可查看文件、管道、设备等打开的文件,在端口查询场景中,其优势是可通过端口直接定位进程,并显示详细的文件描述符信息。
基本用法与参数
-
查看指定端口占用的进程:
lsof -i:端口号
例如查看8080端口:
lsof -i:8080
输出示例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME java 5678 root 34u IPv6 12345 0t0 TCP *:8080 (LISTEN)其中
COMMAND为进程名,PID为进程ID,FD为文件描述符,TYPE为网络类型(IPv4/IPv6),NAME为监听的地址和端口。 -
查看所有监听端口:
lsof -i -P -n | grep LISTEN
参数说明:
-i显示网络文件,-P不解析端口号(显示数字),-n不解析主机名,grep LISTEN过滤监听状态。 -
按进程ID查看端口:
若已知进程ID(如5678),可通过以下命令查看其占用的所有端口:lsof -p 5678 -i
适用场景
lsof适合需要查看进程打开的“所有文件”而不仅是端口的场景,例如排查端口是否被文件占用、查看进程的网络连接详情等。
通过/proc文件系统查看端口占用(底层方法)
Linux内核通过/proc文件系统暴露进程信息,无需额外工具即可直接查看端口占用,适合无netstat、ss等工具的 minimal 环境或底层调试。
操作步骤
-
查看所有监听端口对应的进程:
遍历/proc目录下的进程ID(/proc/[PID]/net/目录包含网络相关信息):for pid in $(ls /proc | grep -E '^[0-9]+$'); do if [ -f /proc/$pid/net/tcp ]; then grep -q " 06 " /proc/$pid/net/tcp && echo "PID $pid: $(cat /proc/$pid/cmdline)" fi done
说明:
tcp文件中每个连接一行,格式为本地地址:端口 远程地址:端口 状态,状态06(十六进制)表示LISTEN(十进制为6)。
-
查看指定端口的十六进制表示:
端口号在/proc/[PID]/net/tcp中以十六进制存储,需转换,例如80端口(十六进制0050),可通过以下命令查找:grep " 050 " /proc/*/net/tcp
输出包含PID,再通过
cat /proc/[PID]/cmdline获取进程名。
局限性
需要手动解析十六进制,操作较复杂,适合有底层调试需求的用户。
工具对比与场景选择
为方便选择,以下是各工具的对比:
| 工具名 | 常用命令 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| netstat | netstat -tulnp |
通用,功能全面 | 速度慢,逐渐被淘汰 | 旧系统或基础网络查询 |
| ss | ss -tulnp |
速度快,现代系统首选 | 参数较复杂 | 高并发、生产环境快速查询 |
| lsof | lsof -i:端口号 |
功能全,可查文件描述符 | 依赖lsof包,资源占用稍高 |
复杂场景(如排查文件与端口冲突) |
| /proc | grep /proc/*/net/tcp |
无需工具,底层信息 | 操作复杂,需解析十六进制 | minimal环境或底层调试 |
实际应用技巧
-
快速定位占用端口的进程:
若发现8080端口被占用,可直接使用ss -tulnp | grep ':8080'或lsof -i:8080,获取PID后通过kill -9 PID终止进程(谨慎使用)。 -
查看所有端口及进程信息:
使用ss -tulnp或netstat -tulnp,结合awk提取关键信息:ss -tulnp | awk '{print $5, $7}' | grep -v 'Local Address:Port' | sort -u输出格式为
IP:端口 PID/进程名,方便查看端口绑定情况。 -
监控端口变化:
使用watch命令实时更新端口占用情况:watch -n 1 'ss -tulnp | grep :8080'
相关问答FAQs
问题1:如何查看所有端口及对应的进程信息,包括非监听状态的连接?
解答:使用ss -tanp或netstat -tanp命令,其中-a显示所有连接(包括监听、已连接、TIME_WAIT等),-t为TCP,-u为UDP,-n以数字形式显示,-p显示进程信息。
ss -tanp | grep -v 'Netid State' # 过滤表头,显示所有TCP连接及进程
输出包含本地端口、对端端口、连接状态及进程ID,可全面了解端口使用情况。
问题2:端口被占用但无法找到对应进程,如何处理?
解答:可能原因包括:(1)僵尸进程或已结束进程未释放端口;(2)内核模块占用端口(如NAT、防火墙规则),处理步骤如下:
- 确认端口状态:
ss -tulnp | grep :端口号,若无进程信息,可能是内核占用。 - 检查内核模块:
sudo lsmod | grep -i 端口号相关模块(如nf_conntrack),尝试卸载模块:sudo rmmod 模块名。 - 重启相关服务:若为服务异常(如Nginx、Apache),重启服务释放端口:
sudo systemctl restart 服务名。 - 强制关闭端口:若确认无进程,可临时通过
fuser -k 端口号/协议关闭(如fuser -k 8080/tcp),但需谨慎操作,避免影响系统稳定性。
原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/21061.html