端口占用排查:netstat 与资源监视器
发布时间:2026-01-23 13:32       
更新时间:2026-01-24 04:23
新服务启动报"端口被占用",两分钟可以查清占用者,剩下的只是决定改端口还是处理进程。
第一步:找到占用端口的 PID
管理员身份打开命令行,以 8080 端口为例:
netstat -ano | findstr :8080
输出中状态为 LISTENING 那一行,最后一位数字就是 PID(进程号)。UDP 端口没有 LISTENING 状态,直接看对应行即可。这一步把范围从六万多个端口缩到一个数字。findstr 也支持一次查多个:netstat -ano | findstr ":8080 :443"。顺带认识一下 TIME_WAIT 状态:它表示连接刚关闭的残留,几十秒内自动消失,不算占用,看到一堆 TIME_WAIT 不必去杀进程,真正挡住启动的是 LISTENING。看到占用者是 System(PID 4),多数是某服务以内核方式绑定了端口,按服务排查,别去动 System。
第二步:把 PID 翻译成进程
tasklist /fi "PID eq 12345"
或者打开任务管理器的"详细信息"页,按 PID 列排序直接找。到这一步,占用者是 nginx、IIS 还是别的程序已经清楚,顺便能看到它的路径。
第三步:改端口还是杀进程
判断标准一句话:占用者是有用的服务,改自己;占用者是不该存在的残留,处理掉。机器上已有网站占着 80,新应用就改用 8080;反过来,测试后没退干净、进程崩了还握着端口的残留,用 taskkill /PID 12345 /F 结束,再正常启动目标服务。老应用改不了端口的还有个折中:用 netsh 的端口代理把新端口转回旧端口,netsh interface portproxy add v4tov4 listenport=9000 connectport=8080 connectaddress=127.0.0.1,应用不用动,对外端口先换掉。拿不准占用者有没有用,看它的启动时间:跟着系统一起启动的多是正经服务,几分钟前才冒出来的更可疑。
第四步:验证
再跑一次 netstat -ano | findstr :8080,确认旧占用消失、新服务进入 LISTENING 状态,业务再实测一次。应用随机端口总撞车的场景,先看动态端口范围:netsh int ipv4 show dynamicport tcp;想给应用固定留一个端口,netsh int ipv4 add excludedportrange protocol=tcp startport=8080 numberofports=1 把它排除在动态分配之外,重启也不会被抢。
图形化路径
不想敲命令,运行 resmon 打开资源监视器,"网络"标签下的"侦听端口"列表把端口、PID、进程名一屏列全。命令行快,图形直观,会一个就够用。