2、Windows端口排查:netstat命令详解、findstr过滤、tasklist定位进程、资源监视器图形化排查

Windows 上排查端口占用,说白了就两件事:谁在监听?谁占着端口? 很多新手一上来就翻注册表、装第三方工具,其实系统自带的工具完全够用。我个人习惯,先命令行快速定位,再图形化确认,效率最高。

核心思路: netstat 查端口 → findstr 过滤 → tasklist 定位进程 → 资源监视器图形化确认。四步走,基本没有查不出来的端口问题。

2.1 netstat 命令详解

netstat 是 Windows 下最基础的网络排查命令。我刚开始做运维时,就靠它吃饭。它的核心参数就几个,记住就行:

参数作用我的用法
-a显示所有连接和监听端口必加,不然看不到监听状态
-n以数字形式显示地址和端口不加的话会反解域名,慢得要命
-o显示关联的进程 PID定位进程的关键
-b显示可执行程序名称需要管理员权限,我一般用 -o 替代

我最常用的组合拳:

netstat -ano

这条命令会列出所有 TCP/UDP 连接,包括 PID。输出大概长这样:

协议  本地地址          外部地址        状态       PID
TCP    0.0.0.0:135       0.0.0.0:0       LISTENING  1056
TCP    0.0.0.0:445       0.0.0.0:0       LISTENING  4
TCP    192.168.1.10:5432 0.0.0.0:0       LISTENING  6780
UDP    0.0.0.0:1900      *:*                        1232

看到 LISTENING 就是正在监听的端口。ESTABLISHED 是已建立的连接。TIME_WAIT 是等待关闭的连接,这个状态多了说明端口释放慢。

小技巧: 如果输出太长,可以加 | more 分页查看。但我更推荐直接配合 findstr 过滤。

2.2 findstr 过滤:精准定位

netstat 输出动辄几百行,你不可能一行行看。findstr 就是 Windows 下的 grep,用来过滤关键字。

比如我想查 5432 端口谁在用:

netstat -ano | findstr :5432

输出:

TCP    0.0.0.0:5432    0.0.0.0:0    LISTENING    6780

看到 PID 是 6780。接下来用 tasklist 查这个 PID 是谁:

tasklist | findstr 6780

输出:

postgres.exe    6780 Services    0     45,680 K

原来是 PostgreSQL 占着 5432 端口。嗯,这里要注意:findstr 默认区分大小写,但端口号是数字,一般没问题。如果过滤进程名,建议加 /i 忽略大小写。

我曾经遇到一个坑:某台服务器 8080 端口被占用,用 findstr :8080 死活查不到。后来发现是 netstat -ano 输出里端口显示的是 :8080,但前面有个空格。改成 findstr "8080" 不带冒号就查到了。所以,过滤时别太死板,多试几种写法。

2.3 tasklist 定位进程

tasklist 是 Windows 的进程列表工具。拿到 PID 后,用它查进程名和详细信息:

tasklist /FI "PID eq 6780"

输出:

映像名称         PID 会话名      会话#    内存使用
========================= ======== ================
postgres.exe      6780 Services     0     45,680 K

如果想知道这个进程的完整路径,加 /V 参数:

tasklist /V /FI "PID eq 6780"

输出会多一列 映像路径,直接告诉你程序在哪个目录。这个在排查恶意软件时特别有用。

注意: 有些进程(比如 svchost.exe)会承载多个服务,光看进程名不够。这时候需要用 tasklist /SVC 查看该进程下运行的服务列表。

2.4 资源监视器图形化排查

命令行虽然快,但有时候图形化更直观。资源监视器(resmon.exe)是我排查端口问题的第二选择。

打开方式:Win + R → 输入 resmon → 回车。或者从任务管理器 → 性能 → 打开资源监视器。

切换到 网络 选项卡,你会看到:

  • 有活动的进程:列出所有正在使用网络的进程,按流量排序
  • 网络活动:显示每个进程的具体连接,包括本地端口、远程地址、发送/接收字节数
  • TCP 连接:按状态分组,监听、已建立、等待关闭一目了然
  • 监听端口:直接列出所有监听中的端口和对应进程

我最常用的是 监听端口 列表。比如我想查 3306 端口,直接在列表里找,右键 → 结束进程,就能释放端口。但注意:别乱杀系统进程,我曾经手滑把 RPC 服务杀了,结果远程桌面直接断开。

资源监视器还有个好处:实时刷新。你启动一个服务,端口立刻出现在列表里;关闭服务,端口消失。比命令行反复敲 netstat 方便多了。

2.5 实战:完整排查流程

假设你启动应用时报错 端口 8080 被占用,按我的习惯来:

  1. 命令行快速定位:
netstat -ano | findstr :8080

输出:

TCP    0.0.0.0:8080    0.0.0.0:0    LISTENING    4520
  1. 查进程名:
tasklist | findstr 4520

输出:

java.exe    4520 Console    1     256,780 K

原来是 Java 进程。

  1. 确认是否该杀:

用 tasklist /V /FI "PID eq 4520" 看完整路径,确认是哪个 Java 应用。如果是自己的测试程序,直接 taskkill /PID 4520 /F 杀掉。如果是生产服务,先查配置,改端口重启。

  1. 图形化确认(可选):

打开资源监视器 → 网络 → 监听端口,找到 8080,右键查看进程属性,确认无误。

我的习惯: 命令行查得快,图形化看得清。先用 netstat + findstr 秒定位,再用资源监视器确认细节。两者结合,没有查不出的端口问题。

2.6 知识体系:Windows 端口排查核心逻辑

下面这张图总结了 Windows 端口排查的完整流程和工具链,建议收藏:

Windows 端口排查核心逻辑图 Windows 端口排查核心逻辑 端口被占用 / 无法启动 第一步:netstat -ano 查看所有连接 列出端口状态、PID、本地地址 第二步:findstr 过滤目标端口 netstat -ano | findstr :8080 第三步:tasklist 定位进程 tasklist | findstr PID 或 tasklist /V /FI "PID eq xxx" 第四步:资源监视器图形化确认 resmon → 网络 → 监听端口 → 右键查看属性 确认是否 该杀? taskkill /F /PID 修改应用端口 提示:命令行查得快,图形化看得清。两者结合,没有查不出的端口问题。

这张图把整个排查流程串起来了。你想想看,从问题出发,四步走完,最后决策是杀进程还是改配置,清清楚楚。我在实际项目中,90% 的端口问题都能在 30 秒内定位完成,靠的就是这套流程。