查端口占用需先用lsof(macOS/Linux)或Get-NetTCPConnection(Windows)定位PID,再软杀后补硬杀并清子进程;不同功能须改对应配置:Live Server改liveServer.settings.port,Node调试改launch.json的port或用${env:PORT},Codex等扩展则必须杀进程。

查谁在占 3000/5500/9229 这些端口
VS Code 报 EADDRINUSE,八成不是别人占的,而是你自己上一次调试、Live Server 或 node 进程没退干净。别靠任务管理器里“node.exe”名字瞎猜——一堆同名进程,PID 才是唯一标识。
直接在 VS Code 内置终端(Ctrl + `)里执行对应命令:
- macOS/Linux:
lsof -ni :5500(把5500换成你实际报错的端口;-n跳 DNS,-i只筛网络连接) - Windows PowerShell:
Get-NetTCPConnection -LocalPort 5500 | Select-Object OwningProcess, State(输出里OwningProcess就是 PID,不用转换) - Windows CMD:
netstat -ano | findstr :5500(注意输出中 PID 是十进制,得去任务管理器“详细信息”页开启“PID”列才能匹配)
如果 lsof 报 command not found,macOS 先跑 xcode-select --install;Windows 上 netstat 不可用时,优先换 PowerShell 命令。
杀进程不能只 kill -9 或 taskkill /f /pid
Node 进程常拉起 npm/yarn/子线程,硬杀主进程后,子进程大概率继续占端口或锁文件。直接 kill -9 或 taskkill /f /pid 容易留坑。
正确做法分两步:
- macOS/Linux:
kill 1234(发SIGTERM),等 2 秒无响应再kill -9 1234 - Windows:
taskkill /f /t /pid 1234(关键在/t,它会连带干掉所有子进程) - 更彻底清理 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 :5500 或 Get-NetTCPConnection -LocalPort 5500 应该无输出。有输出说明还有漏网之鱼。
使用一条命令部署ProbeChain Rydberg测试网代理节点。自动注册为Agent(NodeType=1),免gas,支持macOS/Linux/Windows。触发词:/r
launch.json 改了 port 还报错?你改错地方了
launch.json 里的 port 只管 Node.js 调试器(比如 V8 的 --inspect 端口),不影响前端 dev server、Live Server 或 Codex 登录服务。光改这里,对 EADDRINUSE :::3000 无效。
不同功能走不同配置项:
- Live Server 插件:在 VS Code 设置里搜
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 配置。
代码里没写死端口,但 npm start 还是撞车
很多脚手架(比如 create-react-app)在 package.json 的 scripts 里硬编码了端口:"start": "react-scripts start --port 3000"。下次开新终端照样撞。
真正省心的做法是让端口“动态可选”:
- 启动时传参:
npm start -- --port 3001(注意双横线) - 用环境变量:
PORT=3001 npm start - 代码里支持优雅关闭:监听
process.on('SIGINT', shutdown)和server.close(),避免 TIME_WAIT 状态残留 - 监听双栈:
server.listen(3000, '127.0.0.1')比server.listen(3000)更明确,减少 IPv6 相关冲突
防复发的关键不在“杀得狠”,而在“退得干净”——进程退出信号、套接字释放、子进程清理,三者缺一不可。一个没处理好,端口就还在那儿挂着。

















