直接查pid定位并分步杀进程最有效:先用lsof/get-nettcpconnection/netstat查pid,再用ps/tasklist确认进程名,软杀(kill/term)后补硬杀,windows用/taskkill /t清子进程,最后验证端口释放。

直接查 PID 杀进程最有效,但别一上来就 kill -9 或 taskkill /f —— 很多“端口被占”其实是 VS Code 自己的残留调试进程、Live Server 或 Codex 登录服务没退出干净,硬杀容易留锁或触发二次冲突。
怎么快速定位占用 3000/5500/1455 这类常见端口的进程
先别猜,用系统命令直出 PID:
- macOS/Linux:
lsof -ni :3000(加-n避免 DNS 解析卡顿,-i只看网络连接);如果报command not found,先运行xcode-select --install或brew install lsof - Windows(PowerShell):
Get-NetTCPConnection -LocalPort 3000,比netstat更准,直接返回OwningProcess字段就是 PID - Windows(CMD):
netstat -ano | findstr :3000,注意输出中 PID 是十进制,得去任务管理器“详细信息”页开启“PID”列才能对上
查到 PID 后,别急着杀——先用 tasklist /fi "PID eq 1234"(Windows)或 ps -p 1234 -o comm=(macOS/Linux)确认进程名。常见结果是 Code.exe、node.exe、Code Helper,基本都是 VS Code 自家的。
杀进程要分两步:先软停,再清树
直接 kill -9 或 taskkill /f /pid 容易让子进程(比如 Node 子线程、GPU 渲染进程)继续占着端口或文件锁。正确顺序是:
- macOS/Linux:先
kill 1234(发 SIGTERM),等 2 秒没反应再kill -9 1234 - Windows:用
taskkill /f /t /pid 1234,其中/t关键——它会连带干掉所有子进程,尤其对node.exe下挂的npm或yarn进程很必要 - 更彻底(VS Code 全局):macOS/Linux 执行
killall -r "Code Helper|Code|Electron";Windows 执行taskkill /f /t /im Code.exe && taskkill /f /t /im CodeHelper.exe
杀完立刻验证:lsof -i :3000 或 Get-NetTCPConnection -LocalPort 3000 应该无输出。有输出说明还有漏网之鱼。
为什么改了 launch.json 的 port 还报 EADDRINUSE
常见错因不是配置没生效,而是你改的是调试端口,但真正占着端口的是 Live Server、Codex 登录服务或项目脚手架本身:
-
launch.json里的port只管 Debugger(如 Node.js 调试器),不影响前端 dev server;Live Server 插件走的是自己配置项:liveServer.settings.port,在 VS Code 设置里搜这个改 - Codex 登录失败报
Port 127.0.0.1:1455 is already in use?这是扩展内置回调服务端口,不能通过launch.json改,必须杀掉占用进程或重启 VS Code 全局 - React/Vite/Angular CLI 启动时硬编码端口(如
npm start -- --port 3001),改launch.json完全无效;得在终端里加环境变量:PORT=3001 npm start,或代码里写成app.listen(process.env.PORT || 3000)
还有一个隐蔽点:IPv4 的 127.0.0.1:3000 和 IPv6 的 ::1:3000 看似不同地址,但共享端口。前一个进程绑了 :::(即全地址),新进程即使只绑 127.0.0.1 也会冲突。
防复发:别让端口写死在任何地方
手动查杀是救火,真正省心的是让端口“活”起来:
- Node.js 服务代码里,永远别写
server.listen(3000),改成server.listen(process.env.PORT || 3000) - VS Code 的
launch.json中,"port": "${env:PORT}"比写死数字靠谱;启动前设PORT=3001,调试和 CLI 就能共用同一端口 - package.json 的 scripts 别写
"start": "react-scripts start --port 3000",删掉--port,靠环境变量控制 - Live Server 插件配置项
liveServer.settings.port设为0,它会自动选空闲端口(但注意:某些框架不认0,得配具体数字)
最常被忽略的是:改完配置后没关掉已打开的调试会话或终端服务,旧进程还在跑。务必先停止所有相关会话,再重试新配置。











