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)
酷番叔酷番叔
上一篇 2025年8月31日 20:38
下一篇 2025年8月31日 21:04

相关推荐

  • 为什么加班越多效率越低?

    如何将本地文件上传到 Linux 服务器(详细指南)在日常开发、运维或数据管理中,将本地文件上传到 Linux 服务器是高频操作,本文提供 4 种主流方法,涵盖命令工具与图形界面,兼顾安全性与效率,适合不同技术背景的用户,SCP 命令(安全复制)适用场景:快速传输单个文件或小批量文件,基于 SSH 加密,操作步……

    2025年7月16日
    5500
  • linux文件权限如何查看文件夹权限

    Linux 中,可使用 ls -ld 文件夹名 命令来查看文件夹的

    2025年8月15日
    2800
  • NUMA的秘密是什么?

    在Linux系统中,NUMA(Non-Uniform Memory Access,非统一内存访问)是一种针对多处理器服务器的内存架构设计,旨在提升大型系统的性能,某些场景下(如特定应用程序优化或解决兼容性问题)可能需要关闭NUMA,以下是详细的操作方法和注意事项:作用:NUMA将CPU和内存划分为多个”节点……

    2025年6月25日
    5100
  • 桌面版Linux环境下,如何调出命令行输入命令?

    桌面Linux虽然图形界面友好,但命令行(Terminal/Shell)仍是高效管理系统的核心,无论是安装软件、配置系统,还是调试问题,掌握命令行输入都能大幅提升操作效率,本文将详细介绍桌面版Linux中打开和使用命令行的多种方法,帮助新手快速入门,打开终端的多种方法桌面Linux提供了多种启动终端的方式,用户……

    2025年10月3日
    1000
  • Kali Linux系统升级全流程如何操作?详细步骤与方法有哪些?

    Kali Linux作为专为渗透测试和安全审计设计的Linux发行版,其工具库和内核的及时更新对于保持系统安全性和功能性至关重要,定期升级不仅能获取最新的安全补丁、修复已知漏洞,还能体验新工具的特性和性能优化,本文将详细介绍Kali Linux的升级流程,包括常规升级、大版本升级以及升级后的注意事项,帮助用户确……

    2025年9月10日
    2000

发表回复

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

联系我们

400-880-8834

在线咨询: QQ交谈

邮件:HI@E.KD.CN

关注微信