首页/系统/Windows 运维速查/定位端口被哪个进程占用

定位端口被哪个进程占用

经典组合拳:netstat 找 PID → tasklist/Get-Process 找进程名,解决“端口被占用”启动失败问题。

Windows 运维速查系统更新于 2026-10-13

端口占用怎么定位

程序启动时报出「地址已在使用」或者端口被拒,第一件事就是找出到底是哪个进程占着这个端口。Windows 上的经典路径是两步走:先用 netstat 的 -ano 组合拿到占用该端口的进程编号,再用进程查询命令把编号翻译成可执行文件名与路径。PowerShell 提供了更直接的等价写法,一步就能输出进程对象。判断清楚是系统服务、遗留进程还是同应用的另一个实例,再决定是结束进程、改端口还是停服务。

基本信息

适用平台Windows CMD 与 PowerShell(Windows 7 及以上)
CMD 两步法netstat -ano | findstr :端口 拿到 PID,再 tasklist /FI "PID eq 编号"
PowerShell 一行流Get-NetTCPConnection -LocalPort 端口 取 OwningProcess 后交给 Get-Process
TCP 与 UDP 区别TCP 监听可用上述命令,UDP 监听需用 Get-NetUDPEndpoint 查看
权限查看不需要提升;结束进程视目标进程而定,系统进程需管理员
配套命令taskkill 结束进程、Get-Process 查进程详情、Get-Service 判断是否由服务承载

典型使用场景

  • 应用启动失败报端口被占用,需要确认占用者身份
  • 同一端口上有两个实例时,判断哪一个才是要保留的
  • 确认端口确实由预期服务监听,而不是被其它程序抢先绑定
  • 清理测试遗留进程,避免环境被污染导致结果不可信
  • 排查端口被系统保留或由共享宿主进程承载的情况
  • 变更配置前后做对比,验证旧实例已完全退出

常用示例

常用示例
:: 第一步:找出占用 8080 端口的进程编号
netstat -ano | findstr :8080
:: 只看监听状态,避免看到仅是客户端连接的条目
netstat -ano | findstr :8080 | findstr LISTENING
:: 第二步:把 PID 翻译成进程名(示例中编号为 4321)
tasklist /FI "PID eq 4321"
:: 查看该进程的完整路径与启动方式
tasklist /v /FI "PID eq 4321"
:: 结束进程(先普通结束,无效再强制)
taskkill /PID 4321
:: 强制结束并带上子进程
taskkill /F /T /PID 4321

PowerShell 等价写法

PowerShell 等价写法
# 一步拿到占用进程对象
Get-NetTCPConnection -LocalPort 8080 -State Listen | Select-Object -ExpandProperty OwningProcess | ForEach-Object { Get-Process -Id $_ }
# 直接输出进程名与路径
Get-NetTCPConnection -LocalPort 8080 | Select-Object LocalAddress, LocalPort, State, @{n='进程';e={(Get-Process -Id $_.OwningProcess).ProcessName}}
# UDP 端口占用要用专门的命令
Get-NetUDPEndpoint -LocalPort 5353 | Select-Object LocalAddress, LocalPort, OwningProcess
# 判断是否由服务承载,再决定停服务而不是杀进程
Get-Process -Id 4321 | Select-Object Name, Path, StartTime

结果判读与处置

观察到的情况含义建议处置
监听地址为 0.0.0.0 且进程为业务程序端口确实被目标程序占用确认是否重复启动或旧实例未退出
进程为 svchost 或系统服务端口由系统服务持有改配置或停服务,不要直接结束进程
同一端口出现多行且 PID 不同IPv4 与 IPv6 双栈分别绑定注意地址族差异,避免只处理一半
只有建立连接没有监听是客户端发起的外连不是端口占用,方向判断要更正
找不到任何条目端口当前空闲或被系统临时保留确认程序是否根本没启动
IPv4 与 IPv6 双栈会让同一端口出现多行记录,处理时要看清本地地址列是 0.0.0.0 还是双冒号形式,只关掉一条往往解决不了冲突。
系统服务或共享宿主进程占用的端口,直接结束进程会被自动拉起或牵连其它服务;正确方向是停服务或调整配置端口,而不是反复杀进程。

定位前要准备的信息

  • 确认报错里提到的端口号,注意区分本地端口与对端端口
  • 确认程序绑定的地址族,只处理 IPv4 记录常常不够
  • 记录当时的时间点,便于在日志里找到对应的启动失败记录
  • 判断目标是服务还是普通进程,决定用停服务还是结束进程的方式处理
  • 处置后重新执行一次端口查询,确认旧占用已经释放

易错点

  • 直接杀进程解决占用:如果占用者是系统服务或共享宿主,进程会被自动重启,且可能连带中断其它依赖服务
  • 只看端口数字不看监听地址:客户端连接的端口号看起来一样,但方向完全不同,务必确认是监听还是外连
  • 忽略双栈:只处理 IPv4 的占用记录,IPv6 那条仍会阻止程序启动
  • 用 -IM 按名称批量结束:多实例场景会杀掉不该结束的进程,优先按端口找到的精确编号处理
  • 在 PowerShell 里解析 netstat 文本:字段宽度与列顺序会变,应改用网络连接相关命令直接取属性

数据来源与参考

  • Microsoft Learn:netstat 命令
  • Microsoft Learn:Get-NetTCPConnection

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌