服务器测评网
我们一直在努力

如何查看某个端口被哪个进程占用了?

在网络世界和系统管理的日常工作中,我们时常会遇到一些令人困惑的问题,一个精心编写的Web应用无法启动,控制台却赫然提示“端口已被占用”;又或者,我们怀疑某个可疑进程正在进行网络通信,却不知其从何入手,这些场景的核心,都指向一个基础且关键的操作:查询端口与进程之间的对应关系,掌握如何查看某个端口占用,以及如何查看某个进程端口占用,是每一位开发者、运维人员乃至高级用户必备的技能,本文将深入浅出地介绍在不同操作系统环境下,实现这两种查询的多种方法,并通过实例和对比,帮助您构建清晰的知识体系。

如何查看某个端口被哪个进程占用了?

核心概念:端口与进程

在开始具体操作之前,我们先简要理解两个核心概念。

端口:如果说IP地址是网络世界中一栋建筑的地址,那么端口就是这栋建筑上不同房间的门牌号,一台计算机可以同时运行多个网络服务,例如Web服务、邮件服务、数据库服务等,操作系统通过端口号来区分这些不同的网络服务,确保数据包能够准确地送达给正确的应用程序,端口号的范围是0到65535,其中0到1023被定义为“熟知端口”,通常分配给一些核心服务(如HTTP的80端口,HTTPS的443端口)。

进程:进程是计算机中正在运行的一个程序的实例,您打开一个浏览器,就会产生一个或多个浏览器进程;启动一个数据库,同样会产生数据库服务进程,每个进程都有唯一的标识符,即进程ID(PID)。

两者之间的关系是:一个进程可以监听一个或多个端口,以接收或发送网络数据,反过来,一个被占用的端口,必然归属于某个特定的进程,我们的任务,就是在这两者之间建立查询的桥梁。

按需查询:查看某个端口占用

当遇到端口被占用的问题时,我们的首要任务是“以端查程”,即根据端口号找到是哪个进程在占用它。

在 Windows 系统中

Windows提供了强大的命令行工具和图形界面来完成这项任务。

使用 netstat 命令

netstat(Network Statistics)是一个经典且功能强大的网络统计工具。

打开命令提示符(CMD)或PowerShell,输入以下命令:

netstat -ano | findstr ":8080"

命令解析:

  • -a:显示所有活动的TCP连接和正在监听的TCP/UDP端口。
  • -n:以数字形式显示地址和端口号,避免DNS解析,加快速度。
  • -o:显示每个连接的所属进程ID(PID)。
  • | findstr ":8080":这是一个管道操作,将netstat的输出结果传递给findstr命令,筛选出包含“:8080”的行。

执行后,您会看到类似如下的输出:

  TCP    0.0.0.0:8080           0.0.0.0:0              LISTENING       12345

最后一列的数字12345就是占用8080端口的进程PID。

通过PID找到进程名,您可以使用tasklist命令:

tasklist | findstr "12345"

或者,更直观的方式是打开“任务管理器”(Ctrl+Shift+Esc),切换到“详细信息”选项卡,找到PID为12345的进程,即可看到其映像名称(如java.exe)。

使用 PowerShell 的 Get-NetTCPConnection

如何查看某个端口被哪个进程占用了?

对于更现代的Windows环境,PowerShell提供了面向对象的体验,信息更为结构化。

Get-NetTCPConnection -LocalPort 8080

这个命令会直接返回一个包含详细信息的对象,其中OwningProcess属性就是PID,您可以进一步组合命令来一步到位获取进程名:

Get-NetTCPConnection -LocalPort 8080 | Select-Object -Property *, @{Name="ProcessName"; Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}

在 Linux / macOS 系统中

Linux和macOS作为类Unix系统,拥有相似的强大工具箱。

使用 netstat 命令

尽管netstat在一些新的Linux发行版中逐渐被ss取代,但它依然广为人知且有效。

netstat -tulpn | grep :8080

命令解析:

  • -t:显示TCP端口。
  • -u:显示UDP端口。
  • -l:仅显示监听状态的端口。
  • -p:显示进程ID和进程名。
  • -n:以数字形式显示端口。
  • grep :8080:筛选包含8080的行。

输出结果通常会直接包含进程名和PID,非常直观:

tcp        0      0 0.0.0.0:8080            0.0.0.0:*               LISTEN      12345/java

这里12345是PID,java是进程名。

使用 ss 命令

ss(socket statistics)是netstat的现代替代品,它更快、更高效,能显示比netstat更多的信息。

ss -tulpn | grep :8080

参数含义与netstattulpn高度相似,是Linux系统上查看某个端口占用的首选方法。

使用 lsof 命令

lsof(List Open Files)是一个极其强大的工具,它列出了当前系统打开的所有文件,在Unix哲学中,“一切皆文件”,网络套接字也不例外。

lsof -i :8080

这个命令的输出非常清晰易读,直接列出了占用8080端口的进程名、PID、用户等信息。

逆向追溯:查看某个进程端口占用

有时我们的需求是反过来的:已知一个进程名,想知道它究竟占用了哪些端口。

如何查看某个端口被哪个进程占用了?

在 Windows 系统中

组合使用 tasklistnetstat

首先用tasklisttasklist /fi "imagename eq java.exe"找到Java进程的PID,然后用netstat -ano | findstr "PID"来查找该PID占用的所有端口。

PowerShell 一站式解决

PowerShell的强大在此体现得淋漓尽致。

Get-Process -Name "java" | Select-Object -Property ProcessName, Id, @{Name="Ports"; Expression={(Get-NetTCPConnection | Where-Object { $_.OwningProcess -eq $_.Id }).LocalPort}}

这条命令首先获取名为java的进程,然后为每个进程计算其占用的所有本地端口,并将结果整合展示。

在 Linux / macOS 系统中

组合使用 pgrepnetstat/ss

pgrep命令可以根据进程名直接查找PID。

# 查找ssh进程的PID
pgrep sshd
# 假设PID是678,然后用ss查找其占用的端口
ss -tulpn | grep "678"

这两步可以合并为一行:

ss -tulpn | grep $(pgrep sshd)

lsof 的强大展示

lsof再次以最简洁的方式胜出。

lsof -i -P -n | grep sshd

命令解析:

  • -i:列出所有网络连接。
  • -P:不将端口号转换成服务名(如不将80显示为http)。
  • -n:不将IP地址解析成域名。

或者,更精确地直接查看某个进程打开的所有网络文件:

lsof -i -a -p $(pgrep sshd)

-a表示将其他选项(如-i-p)的逻辑关系设为“与”(AND),确保只显示进程sshd的网络连接。

总结与工具对比

为了方便您快速查阅和选择,下表总结了不同平台下的核心命令:

操作系统 场景:查看某个端口占用 场景:查看某个进程端口占用 推荐工具/方法
Windows netstat -ano | findstr ":端口"
Get-NetTCPConnection -LocalPort 端口
Get-Process ... | Get-NetTCPConnection ... netstat (经典通用)
PowerShell (现代强大)
Linux/macOS ss -tulpn | grep :端口
lsof -i :端口
ss -tulpn | grep $(pgrep 进程名)
lsof -i -P -n | grep 进程名
ss (快速高效)
lsof (功能全面)
赞(0)
未经允许不得转载:好主机测评网 » 如何查看某个端口被哪个进程占用了?