查端口占用必须用命令直出真实pid:windows powershell运行get-nettcpconnection -localport 3000 | select-object owningprocess,macos/linux运行lsof -ni :3000,查到pid后需用taskkill /f /t /pid或kill 12345(再kill -9)清进程树,而非简单硬杀。

查端口占用别靠猜,用命令直出真实 PID
VSCode 报 EADDRINUSE 错误,八成不是真有“僵尸进程”,而是上一次调试、Live Server 或 Run Code 没退出干净,留了个挂着监听套接字的 node.exe、Code Helper 或 Code.exe 在后台。查 PID 别翻任务管理器——一堆 node.exe 容易看错,也漏掉子进程。
- Windows(PowerShell):
Get-NetTCPConnection -LocalPort 3000 | Select-Object OwningProcess,输出里OwningProcess就是真实 PID,不卡 DNS,不依赖第三方 - macOS/Linux:
lsof -ni :3000(加-n跳过 DNS 解析,-i只筛网络连接);若提示command not found,先运行xcode-select --install(macOS)或brew install lsof - Windows(CMD):
netstat -ano | findstr :3000,注意输出中 PID 是十进制,得去任务管理器“详细信息”页开启“PID”列才能对上
杀进程不能只 kill -9 或 taskkill /f /pid
直接 kill -9 12345 或 taskkill /f /pid 12345 容易留尾巴:Node 进程拉起的 npm、yarn、GPU 渲染子进程还在,端口照占。必须清整棵进程树。
- Windows:
taskkill /f /t /pid 12345,关键在/t—— 它会连带干掉所有子进程 - macOS/Linux:
kill 12345(先发 SIGTERM,温和退出),等 2 秒没反应再kill -9 12345 - VSCode 全局残留更彻底:
taskkill /f /t /im Code.exe && taskkill /f /t /im CodeHelper.exe(Windows);killall -r "Code Helper|Code|Electron"(macOS/Linux)
改端口比杀进程更省事,但得改对地方
launch.json 里改了 port 还报错?因为不同组件用的是不同配置项,光改一处不生效。
- Live Server 插件:搜 VS Code 设置里的
liveServer.settings.port,填个空闲端口如5501 - Node.js 调试器:
.vscode/launch.json中确保"port": 9230明确指定(别用默认9229) - Chrome 调试扩展:全局设置搜
debug.javascript.chrome.port直接改 - 项目脚手架(如 create-react-app):终端启动时加参数,
npm start -- --port 3001,或设环境变量PORT=3001 npm start
代码里硬编码端口是复发根源
很多 Express/Koa 服务写死 app.listen(3000),下次开新终端又撞上。真正防复发的做法是让端口可选。
- Node.js 服务代码里改成:
app.listen(process.env.PORT || 3000) -
launch.json中可引用变量:"port": "${env:PORT}" -
package.json脚本别写死:"start": "react-scripts start --port 3000"→ 改成"start": "react-scripts start",靠环境变量或 CLI 参数控制
端口冲突的本质不是系统资源不够,而是进程生命周期管理没闭环——没释放、没清理、没抽象。查 PID、清进程树、改配置、动代码,四步里漏掉任何一环,问题都会回来。











