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:端口表示绑定的地址和端口,StateLISTEN表示进程正在监听该端口,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命令查看端口占用(现代高效工具)

ssiproute2工具包的一部分,专为替代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'

优势

相比netstatss在处理大量连接时速度显著更快(例如数万连接场景下,ss耗时可能是netstat的1/10),且支持更丰富的过滤条件(如按statetypesport等过滤),适合生产环境使用。

使用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文件系统暴露进程信息,无需额外工具即可直接查看端口占用,适合无netstatss等工具的 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 -tulnpnetstat -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 -tanpnetstat -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)
酷番叔酷番叔
上一篇 4小时前
下一篇 3小时前

相关推荐

  • linux如何查询两个关键字

    Linux中,可使用`grep -E ‘关键字1|关键字2’ 文件名

    2025年8月17日
    600
  • 为什么用这3个AI工具的人效率偷偷翻倍?

    前提条件安装GCC编译器Linux默认不安装编译器,需手动安装GCC(GNU Compiler Collection):sudo apt update && sudo apt install gcc # Debian/Ubuntusudo yum install gcc # CentOS/RHE……

    2025年7月19日
    1700
  • AppImage如何轻松运行于任何电脑?

    Linux QQ登录详细指南在Linux系统中登录QQ,目前主要有三种可靠方式:官方原生版本、Wine兼容方案和第三方开源客户端,以下是具体操作步骤及注意事项:官方原生QQ for Linux(推荐首选)适用系统:Ubuntu/Debian、Arch、Fedora等主流发行版优势:腾讯官方维护,安全性高,无兼容……

    2025年7月1日
    2600
  • 如何避免CentOS/RHEL 7/8升级崩溃?

    在Linux系统中处理RAR文件需要安装专门的工具,因为默认不支持这种专利压缩格式,以下是详细安装指南,涵盖主流发行版和注意事项:安装unrar工具(推荐方法)通过系统包管理器安装最安全高效,支持解压RAR文件(压缩RAR需商业许可),Debian/Ubuntu系系统sudo apt update &amp……

    2025年7月28日
    1500
  • 如何访问linux系统版本

    Linux终端输入cat /etc/os-release或`lsb_release -a

    2025年8月16日
    700

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信