查端口占用应先用lsof -ni :端口号(macos/linux)或get-nettcpconnection -localport 端口号(windows powershell)精准定位pid,再分步软杀后硬杀并清理子进程,最后按功能修改对应配置项如liveserver.settings.port或launch.json中的port字段。

查谁在占端口:用对命令,别被 DNS 卡住
端口被占用不是 VS Code 的 bug,而是系统里已有进程绑定了你要用的端口。别切出去开新终端,直接在 VS Code 内置终端(Ctrl + `)里执行对应命令:
- macOS/Linux:
lsof -ni :5500(把5500换成你实际报错的端口号;-n跳过 DNS 解析,-i只筛网络连接) - Windows PowerShell:
Get-NetTCPConnection -LocalPort 5500(直接返回OwningProcess字段,就是 PID,最准) - Windows CMD:
netstat -ano | findstr :5500(输出中 PID 是十进制,需在任务管理器“详细信息”页开启“PID”列才能匹配)
如果 lsof 报 command not found,macOS 先运行 xcode-select --install 或 brew install lsof;Windows 上若 netstat 不可用,优先换 PowerShell 命令。
杀进程不能只 kill -9:Node 和 VS Code 进程树会偷偷续命
查到 PID 后,别立刻 kill -9 或 taskkill /f /pid。Live Server、调试器、甚至 Code Helper 进程常拉起 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 :5500 或 Get-NetTCPConnection -LocalPort 5500 应该无输出。有输出说明还有漏网之鱼。
改端口要对症下药:不同功能走不同配置项
光改 launch.json 的 port 字段,对 Live Server 无效;关掉所有调试会话再改,也未必解决 Codex 登录服务的 1455 端口冲突:
- Live Server 插件:在 VS Code 设置(
Cmd + ,或Ctrl + ,)里搜liveServer.settings.port,填个空闲端口如5501 - Node.js 调试:在项目根目录
.vscode/launch.json中确认port字段没硬编码成9229,改成9230或更高;也可设为"port": "${env:PORT}" - Codex 或 Remote-SSH:这类扩展内置服务端口无法通过
launch.json改,必须杀掉占用进程;Remote-SSH 还得检查remote.SSH.defaultForwardedPorts配置
改完记得关掉已打开的调试会话再重试,旧进程不会自动 reload 配置。
防复发:别让端口写死在代码或配置里
很多项目在 package.json 的 scripts 里写死 react-scripts start --port 3000,下次开新终端又撞上。真正省心的做法是让端口“动态可选”:
- React/Vite 等脚手架支持环境变量:启动前设
PORT=3001 npm start,比改package.json快得多 - Express/Koa 服务代码里别写
app.listen(3000),改成app.listen(process.env.PORT || 3000) - VS Code 的
launch.json中port字段可引用变量:"port": "${env:PORT}" - 禁用自动端口转发(尤其 Remote-SSH)、监听
127.0.0.1而非0.0.0.0、代码支持优雅关闭——这些细节容易被忽略,但恰恰是反复踩坑的根源











