Windows 系统排查:netstat 命令详解
好,咱们正式开始动手排查端口占用。Windows 系统下,最核心的工具就是 netstat。说实话,我见过不少新手一上来就装各种第三方工具,其实大可不必。系统自带的这个命令,用好了,80% 的问题都能当场解决。
我个人习惯,排查端口问题从来不开图形界面。一个 cmd 窗口,几行命令,效率最高。你想想看,服务器上哪有那么多图形界面给你用?
netstat 命令基础
netstat 的全称是 Network Statistics,用来显示网络连接、路由表、接口统计等信息。咱们排查端口占用,主要用它的连接查看功能。
先看一个最基础的用法:
C:\Users\admin> netstat
Active Connections
Proto Local Address Foreign Address State
TCP 192.168.1.100:49678 stackoverflow:https ESTABLISHED
TCP 192.168.1.100:49679 dns.google:https ESTABLISHED
TCP 0.0.0.0:135 DESKTOP:0 LISTENING
TCP 0.0.0.0:445 DESKTOP:0 LISTENING
这个输出能看到什么?协议类型、本地地址和端口、远程地址和端口、连接状态。但有个问题——你看不到进程 ID。光知道 135 端口在监听,你根本不知道是哪个程序干的。
嗯,这里要注意,不加参数时 netstat 只显示当前用户的连接。想看到所有进程的信息,必须加参数。
netstat -ano:黄金组合
我排查端口问题时,90% 的情况只用这一组参数:-ano。这三个字母各有用处:
| 参数 | 作用 | 为什么重要 |
|---|---|---|
-a |
显示所有连接和监听端口 | 不写这个,你只能看到已建立的连接,看不到正在监听的端口 |
-n |
以数字形式显示地址和端口 | 跳过 DNS 解析,速度飞快,输出也干净 |
-o |
显示关联的进程 PID | 这是定位进程的关键,没有它你只能瞎猜 |
组合起来就是:
C:\Users\admin> netstat -ano
Active Connections
Proto Local Address Foreign Address State PID
TCP 0.0.0.0:80 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:135 0.0.0.0:0 LISTENING 1232
TCP 0.0.0.0:443 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:445 0.0.0.0:0 LISTENING 4
TCP 0.0.0.0:3306 0.0.0.0:0 LISTENING 6780
TCP 0.0.0.0:3389 0.0.0.0:0 LISTENING 876
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4521
TCP 0.0.0.0:5040 0.0.0.0:0 LISTENING 876
看到最后一列 PID 了吗?这就是进程的身份证号。有了它,你就能顺藤摸瓜找到罪魁祸首。
netstat -ano | findstr :8080 直接过滤。比如你发现 8080 端口被占,就搜这个端口号,一秒定位。
通过 PID 定位进程
拿到 PID 之后,怎么知道是哪个程序?两种方法:任务管理器或者 tasklist 命令。
先说任务管理器。打开任务管理器,切换到「详细信息」选项卡,找到 PID 列。但说实话,我很少用这个方式。为什么?因为服务器上你未必有图形界面,而且任务管理器有时候会卡。
我更推荐用命令行:
C:\Users\admin> tasklist | findstr 4521
java.exe 4521 Console 1 256,784 K
看到了吧?PID 4521 对应的是 java.exe。一个 Java 进程占用了 8080 端口。这时候你就知道该去检查哪个应用了。
如果想看更详细的信息,可以加 /FI 参数按 PID 过滤:
C:\Users\admin> tasklist /FI "PID eq 4521"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
java.exe 4521 Console 1 256,784 K
tasklist 命令的更多用法
tasklist 不只是查 PID 这么简单。它还能帮你做这些事情:
- 查看所有进程: 直接输入
tasklist,列出所有运行中的进程 - 按映像名称过滤:
tasklist /FI "IMAGENAME eq nginx.exe" - 查看进程的详细信息:
tasklist /V显示进程名、PID、会话名、内存使用、CPU 时间等 - 查看 DLL 信息:
tasklist /M显示每个进程加载的 DLL
举个例子,你想看看系统里跑了几个 nginx:
C:\Users\admin> tasklist /FI "IMAGENAME eq nginx.exe"
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
nginx.exe 12340 Console 1 8,456 K
nginx.exe 12341 Console 1 8,460 K
两个 nginx 进程,一个 master 一个 worker,很典型的架构。
完整排查流程
我把整个流程串起来,画了一张图,你看完就清楚了:
这个流程我用了好多年,从来没出过问题。你按照这个顺序走一遍,99% 的端口占用问题都能定位到具体进程。
实战案例:我遇到的一个坑
讲个真实案例。有一次线上环境,Tomcat 突然起不来了,报 8080 端口被占用。我远程上去一看:
C:\> netstat -ano | findstr :8080
TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 4
PID 是 4?System 进程?我当时就懵了。System 进程怎么可能占 8080?
后来查了半天才发现,原来是之前有人在这台机器上启用了 Windows 的 URL 保留功能,把 8080 端口注册给了 HTTP.sys。用 netsh http show urlacl 一看,果然有个保留项。
解决办法也很简单:
C:\> netsh http delete urlacl url=http://+:8080/
删掉保留项,Tomcat 就能正常启动了。这个坑我印象特别深,所以后来每次排查端口占用,我都会多看一眼 PID 是不是 4。
netstat -ano是排查端口占用的黄金命令,记住这三个参数- PID 是连接进程的桥梁,拿到 PID 后用
tasklist查进程名 - PID 为 4 的进程是 System,可能是内核级监听,需要用
netsh处理 - 用
findstr过滤输出,避免在大量连接中大海捞针
好了,Windows 下的排查方法就这些。工具不复杂,关键是思路要清晰。你只要记住 netstat -ano 加 tasklist 这个组合拳,大部分端口问题都能搞定。