Linux如何查看进程占用端口对应的PID?

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

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),

    linux如何查看进程占用端口

    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 环境或底层调试。

操作步骤

  1. 查看所有监听端口对应的进程:
    遍历/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)。

    linux如何查看进程占用端口

  2. 查看指定端口的十六进制表示:
    端口号在/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环境或底层调试

实际应用技巧

  1. 快速定位占用端口的进程:
    若发现8080端口被占用,可直接使用ss -tulnp | grep ':8080'或lsof -i:8080,获取PID后通过kill -9 PID终止进程(谨慎使用)。

  2. 查看所有端口及进程信息:
    使用ss -tulnp或netstat -tulnp,结合awk提取关键信息:

    ss -tulnp | awk '{print $5, $7}' | grep -v 'Local Address:Port' | sort -u

    输出格式为IP:端口 PID/进程名,方便查看端口绑定情况。

  3. 监控端口变化:
    使用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、防火墙规则),处理步骤如下:

  1. 确认端口状态:ss -tulnp | grep :端口号,若无进程信息,可能是内核占用。
  2. 检查内核模块:sudo lsmod | grep -i 端口号相关模块(如nf_conntrack),尝试卸载模块:sudo rmmod 模块名。
  3. 重启相关服务:若为服务异常(如Nginx、Apache),重启服务释放端口:sudo systemctl restart 服务名。
  4. 强制关闭端口:若确认无进程,可临时通过fuser -k 端口号/协议关闭(如fuser -k 8080/tcp),但需谨慎操作,避免影响系统稳定性。

原创文章,发布者:酷番叔,转转请注明出处:https://cloud.kd.cn/ask/21061.html

赞 (0)
酷番叔酷番叔
上一篇 2025年8月31日 20:38
下一篇 2025年8月31日 21:04

相关推荐

  • Linux如何打开文件?最全方法秒开必看!

    命令行方式(终端操作)适用于服务器环境或快速查看文件,无需图形界面,查看文件内容(不编辑)cat 命令:直接显示整个文件内容(适合小文件), cat filename.txtless 命令:分页查看(可上下滚动),按 q 退出, less longfile.logmore 命令:逐页显示(仅向下翻页),空格键翻……

    2025年7月8日
    29100
  • Linux error13如何解决?

    Linux error13通常指“Permission denied”(权限被拒绝)错误,是用户在操作Linux系统时最常遇到的权限问题之一,该错误可能出现在文件访问、命令执行、服务启动等多种场景下,核心原因是当前用户对目标资源(文件、目录、设备等)缺乏足够的操作权限,解决error13需要从权限管理、安全上下……

    2025年9月9日
    33700
  • Linux hosts文件如何配置?

    hosts文件的位置无论何种Linux发行版,hosts文件均位于 /etc/hosts,这是Linux系统的标准路径,适用于:Ubuntu/DebianCentOS/RHEL/FedoraArch LinuxopenSUSE等可通过命令验证:ls -l /etc/hosts输出示例:-rw-r–r– 1……

    2025年6月20日
    42800
  • Linux如何高效截图录屏?

    原生截图工具(无需安装)全局快捷键(适用大多数桌面环境)PrtSc:捕获整个屏幕,图片自动保存至~/Pictures/Alt + PrtSc:仅捕获当前活动窗口Shift + PrtSc:自定义区域截图(光标变为十字,拖选区域)注:GNOME、KDE Plasma、Xfce等主流环境均支持终端工具scrot……

    2025年7月9日
    43200
  • Linux系统如何彻底卸载Python3?

    在Linux系统中卸载Python3需要根据安装方式选择不同的方法,常见的安装方式包括系统包管理器安装(如apt、yum/dnf)、源码编译安装以及通过第三方工具(如pyenv)安装,卸载前需确认Python3的安装路径及依赖关系,避免误删系统关键组件,以下是详细的卸载步骤和注意事项,卸载前的准备工作确认Pyt……

    2025年9月22日
    25800

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信