端口被占用是系统进程(如未退出的node、Code Helper)所致,需在VS Code内置终端用lsof(macOS/Linux)或Get-NetTCPConnection(Windows PowerShell)查PID,再用kill或taskkill /t精准终止主子进程,并验证无输出才算释放。

端口被占用不是 VS Code 的问题,而是系统里某个进程(大概率是上一个没退出干净的 node、Code Helper 或 npm)还绑着那个端口——直接改配置或硬杀主进程,不查 PID 就动手,八成会漏掉子进程或误伤其他项目。
查谁在占 3000/5500/9229 这些端口
别切出 VS Code,就在内置终端(Ctrl + `)里执行命令,按系统选对工具:
- macOS/Linux:
lsof -ni :3000(把3000换成你报错的端口号;-n跳 DNS 解析,-i只筛网络连接) - Windows PowerShell:
Get-NetTCPConnection -LocalPort 3000(输出中OwningProcess字段就是真实 PID,不用转换) - Windows CMD(需管理员):
netstat -ano | findstr :3000(结果里 PID 是十进制,得去任务管理器“详细信息”页开“PID”列才能比对)
如果 lsof 报 command not found,macOS 先跑 xcode-select --install 或 brew install lsof;Windows 上 netstat 不可用时,换 PowerShell 命令更准。
杀进程必须带子进程参数,否则白杀
Node 服务常拉起 npm、yarn、渲染线程等子进程,只杀主进程,子进程大概率继续占端口:
- macOS/Linux:先
kill 1234(发 SIGTERM),等 2 秒无响应再kill -9 1234 - Windows:必须加
/t参数,taskkill /f /t /pid 1234,否则子进程几乎必漏 - 想清空 VS Code 自家残留:
killall -r "Code Helper|Code|Electron"(macOS/Linux)或taskkill /f /t /im Code.exe && taskkill /f /t /im CodeHelper.exe(Windows)
杀完立刻验证:lsof -i :3000 或 Get-NetTCPConnection -LocalPort 3000 应该无输出;有输出说明还有漏网之鱼。
改端口要打到具体功能的配置点上
launch.json 里的 port 只管 Node.js 调试器(比如 V8 的 9229),对 Live Server、npm start、Vite dev server 完全无效:
- Live Server 插件:VS Code 设置里搜
liveServer.settings.port,填个空闲值如5501 - Node.js 调试:
.vscode/launch.json中确认"port": 9230(避开9229),或设为"port": "${env:PORT}" - React/Vite 等脚手架:不读 VS Code 配置,启动前设环境变量,
PORT=3001 npm start或npm start -- --port 3001 - Express/Koa 代码里别写死
app.listen(3000),改成app.listen(process.env.PORT || 3000)
改完记得关掉所有已打开的调试会话和 Live Server,旧进程不会自动 reload 配置。
最常被忽略的是:查 PID 和杀进程必须用同一套逻辑闭环验证,而不是“我以为杀掉了”。很多报错反复出现,就是因为验证这步跳过了——只要 lsof -ni :3000 或 Get-NetTCPConnection -LocalPort 3000 还有输出,就说明端口没真正释放。











