Windows 端口占用排查与释放

  1. 查看所有端口占用情况

netstat -ano

作用:

  • 查看本机所有 TCP、UDP 连接
  • 查看监听端口、连接状态、PID
  1. 查看指定端口是否被占用

示例:查询端口 15672

netstat -ano | findstr 15672

输出字段说明(按列):

字段 说明
Proto 协议(TCP/UDP)
Local Address 本地地址 + 端口
Foreign Address 外部地址 + 端口
State 连接状态(LISTENING、ESTABLISHED 等)
PID 占用端口的进程 ID

💡 例如显示: TCP 0.0.0.0:15672 ... LISTENING 48980 说明 PID 为 48980 的进程占用了 15672 端口

  1. 根据 PID 查找进程名称

tasklist | findstr 48980

示例输出:

erl.exe 48980 Services

说明:

  • 占用端口的程序是 erl.exe(一般是 RabbitMQ 的后台运行服务)
  1. 杀死进程(释放端口)

普通结束进程

taskkill /PID 48980

强制结束进程(带依赖子进程)

taskkill /PID 48980

连同子进程全部强制杀掉

taskkill /t /f /im erl.exe

⚠️ 注意 /F = 强制 /T = 连带子进程 需要管理员权限,否则可能失败。

  1. 完整排查流程总结
步骤 命令 作用
`netstat -ano findstr 15672`
`tasklist findstr `
taskkill /PID <PID> /F 释放端口

6.常见状态解释

状态 含义
LISTENING 程序正在监听端口
ESTABLISHED 已建立连接
TIME_WAIT 连接等待释放(正常现象)
CLOSE_WAIT 对端关闭但本端未完全关闭(可能卡死)

快速脚本

killport.bat

@echo off
:: --------------------------------------------
:: 强制使用 UTF-8 编码(避免脚本内部乱码)
:: --------------------------------------------
chcp 65001 >nul

:: --------------------------------------------
:: 检查是否传入端口号
:: --------------------------------------------
if "%1"=="" (
    echo ❌ 错误:请使用 killport ^<端口号^>
    echo 示例:killport 8686
    pause
    exit /b
)

set port=%1

echo 🔍 正在查找占用端口 %port% 的进程...

:: --------------------------------------------
:: 精准匹配端口,例如只匹配 ":8686 "
:: 并去重 PID 存入临时文件
:: --------------------------------------------
netstat -ano | findstr /R /C:":%port% " > tmp_netstat.txt

if %errorlevel% neq 0 (
    echo ✅ 端口 %port% 当前没有被任何进程占用
    del tmp_netstat.txt >nul 2>&1
    pause
    exit /b
)

:: 从结果中提取 PID(第 5 列),去重
for /f "tokens=5" %%i in (tmp_netstat.txt) do (
    echo %%i >> tmp_pids.txt
)

:: 去重(依赖 sortsort tmp_pids.txt /unique > tmp_pids_sorted.txt
del tmp_pids.txt >nul 2>&1

:: --------------------------------------------
:: 逐个杀死唯一 PID
:: --------------------------------------------
echo -----------------------------------------
echo ⚙️ 发现以下 PID 占用了端口 %port%type tmp_pids_sorted.txt
echo -----------------------------------------

for /f %%i in (tmp_pids_sorted.txt) do (
    echo 🔥 正在终止 PID %%i ...
    taskkill /PID %%i /F >nul 2>&1

    if !errorlevel! equ 0 (
        echo ✔️ 成功终止 PID %%i
    ) else (
        echo ⚠️ PID %%i 无法终止(可能已退出)
    )
)

:: 清理临时文件
del tmp_netstat.txt >nul 2>&1
del tmp_pids_sorted.txt >nul 2>&1

echo -----------------------------------------
echo 🎉 完成:端口 %port% 已释放
pause
exit /b

想在任何目录下都能直接敲 killport xx 来关闭某个进程

  1. 新建一个工具目录,例如:D:\develop\dev-tools\bin

  2. killport.bat 放进去

    image-68f6e4c1
  3. 把这个目录加到环境变量 PATH

    1. 右键“此电脑” → 属性
    2. 左侧或右边找到 高级系统设置
    3. 下方点 环境变量
    4. 在“用户变量”或“系统变量”中找到 Path → 选中 → 编辑
    5. 点击 新建,输入你的路径,例如:
      • D:\develop\dev-tools\bin

        image-31d91416
  4. 一路“确定”保存

  5. 关闭所有已有的 cmd/PowerShell 窗口,重新打开一个新的

之后就可以在任意位置执行:

killport 8686

killport-40988b41

VibeCoding 导航:⬅️ 02-RabbitMQ 管理界面(15672)无法访问问题排查与解决 | 03-Windows 端口占用排查与释放 | ➡️ 05-红软先锋——码上校园