查端口占用必须用系统命令,不可依赖任务管理器;macOS/Linux用lsof -ni :端口,Windows用Get-NetTCPConnection -LocalPort 端口;杀进程需带/t参数(Windows)或先SIGTERM再SIGKILL(macOS/Linux),并验证无输出;不同功能端口配置互不影响,应分别设置;防复发需用环境变量或端口检查逻辑实现动态分配。

查端口占用必须用系统命令,别靠“没看到进程”判断
VS Code 里跑多个 Node.js 实例时,EADDRINUSE 错误常被误判为“没人占着”,其实只是进程没显式列出。真正占用端口的可能是上一个调试会话残留的 node.exe、Code Helper 或后台 npm 子进程——它们不会出现在任务管理器“名称”列里,只靠 PID 能定位。
macOS/Linux 执行:lsof -ni :3000(把 3000 换成你报错的端口);Windows PowerShell 执行:Get-NetTCPConnection -LocalPort 3000。若 lsof 报 command not found,先运行 xcode-select --install;Windows 上若 netstat 不可用,优先用 PowerShell 命令。
- 不要用任务管理器“按名称结束 node.exe”,可能杀错项目
- 查到 PID 后,用
tasklist /fi "pid eq 1234"(Windows)或ps -p 1234 -o comm=(macOS/Linux)确认进程名 - 常见结果是
Code.exe、node.exe、Code Helper,基本都是 VS Code 自家残留
杀进程不能只 kill -9,子进程会偷偷续命
Node.js 进程树结构复杂,kill -9 或 taskkill /f /pid 只杀主进程,npm/yarn/子线程、GPU 渲染进程仍可能继续绑定端口或锁文件。
使用 JSON Schema 验证 JSON 数据,从示例 JSON 生成 schema,并将其转换为 TypeScript 接口、Python 数据类或 Markdown 文档。
- 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 和 live-server 的端口配置互不影响
改了 launch.json 的 port 字段,对 Live Server 插件完全无效;关掉所有调试会话再改,也压根不解决 Codex 登录服务的 1455 端口冲突。不同功能走不同配置路径,混改等于白忙。
- Live Server:在 VS Code 设置里搜
liveServer.settings.port,填空闲端口如5501,或设为0启用随机端口 - Node.js 调试:在
.vscode/launch.json中改"port": 9230(避开默认9229),并确保runtimeArgs里的--inspect-brk=9230一致 - Codex 或 Remote-SSH:这类扩展内置端口无法通过配置改,只能杀占用进程;Remote-SSH 可加配置
"remote.SSH.defaultForwardedPorts": ["3001", "3002"]避免自动抢3000
防复发的关键是让端口“可变”,不是“写死”
很多项目在 package.json 里硬写 react-scripts start --port 3000,下次开新终端又撞上;launch.json 里写死 9229 更是每天手动改配置的根源。真正省心的做法是让端口脱离人工干预。
- 开发环境代码里加端口检查逻辑(仅限调试):
const server = require('net').createServer(); server.listen(3000, () => { console.log('✅ Ready on port 3000'); server.close(); }).on('error', (err) => { if (err.code === 'EADDRINUSE') console.log('⚠️ Port 3000 in use, try another'); }); - 用环境变量驱动端口:
"port": "${env:PORT}"(launch.json),启动前设PORT=3001 - Node.js 服务务必实现优雅关闭(Graceful Shutdown),避免 Ctrl+C 或关终端后 socket 留在 TIME_WAIT 状态
端口冲突的本质不是“端口不够用”,而是多实例间缺乏隔离意识——每个项目都该有自己明确的端口归属,而不是靠运气抢 3000 或 5500。

















