Windows 端口占用排查与释放
- 查看所有端口占用情况
netstat -ano
作用:
- 查看本机所有 TCP、UDP 连接
- 查看监听端口、连接状态、PID
- 查看指定端口是否被占用
示例:查询端口 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 端口。
- 根据 PID 查找进程名称
tasklist | findstr 48980
示例输出:
erl.exe 48980 Services
说明:
- 占用端口的程序是
erl.exe(一般是 RabbitMQ 的后台运行服务)
- 杀死进程(释放端口)
普通结束进程
taskkill /PID 48980
强制结束进程(带依赖子进程)
taskkill /PID 48980
连同子进程全部强制杀掉
taskkill /t /f /im erl.exe
⚠️ 注意 /F = 强制 /T = 连带子进程 需要管理员权限,否则可能失败。
- 完整排查流程总结
| 步骤 | 命令 | 作用 |
|---|---|---|
| ① | `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
)
:: 去重(依赖 sort)
sort 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 来关闭某个进程
-
新建一个工具目录,例如:
D:\develop\dev-tools\bin -
把
killport.bat放进去
-
把这个目录加到环境变量
PATH里- 右键“此电脑” → 属性
- 左侧或右边找到 高级系统设置
- 下方点 环境变量
- 在“用户变量”或“系统变量”中找到
Path→ 选中 → 编辑 - 点击 新建,输入你的路径,例如:
-
D:\develop\dev-tools\bin
-
-
一路“确定”保存
-
关闭所有已有的 cmd/PowerShell 窗口,重新打开一个新的
之后就可以在任意位置执行:
killport 8686
VibeCoding 导航:⬅️ 02-RabbitMQ 管理界面(15672)无法访问问题排查与解决 | 03-Windows 端口占用排查与释放 | ➡️ 05-红软先锋——码上校园
💬 评论