查端口占用需用lsof或netstat定位PID:Linux/macOS执行lsof -i :3000,Windows执行netstat -ano | findstr :3000;再用kill -9(Linux/macOS)或taskkill /f /pid(Windows)终止对应进程。

查端口占用的进程:用 lsof 或 netstat 快速定位
VSCode 启动调试或本地服务时报 EADDRINUSE,本质是某个进程正占着你要用的端口(比如 3000、8080)。别急着关 VSCode,先确认是谁在抢——Linux/macOS 用 lsof -i :3000,Windows 用 netstat -ano | findstr :3000。输出里 PID 那列就是罪魁祸首。
- macOS 上若提示
command not found: lsof,先装:brew install lsof - Windows 的
netstat结果里 PID 是十进制,任务管理器“详细信息”页需点开“PID”列才能对上 - 如果端口没显出进程名(尤其 macOS 上显示
-),试试加-n参数避免 DNS 解析卡顿:lsof -ni :3000
一键杀掉占用进程:别手抖关错 PID
找到 PID 后,直接干掉它最干脆。Linux/macOS 执行 kill -9 12345(把 12345 换成实际 PID);Windows 用 taskkill /f /pid 12345。但注意:别看到多个 12345 就全杀,有些是子线程或守护进程,只杀主进程即可。
- VSCode 自己的调试进程也常占端口,关掉所有调试会话再查更干净
- 如果
kill报Operation not permitted,说明是 root 进程,加sudo;Windows 上管理员权限运行命令提示符 - Node.js 服务常以
node名出现,但真实 PID 可能属于npm或yarn进程,看 CMD 列更准
改 VSCode 默认调试端口:不是所有配置都管用
不想总杀进程?改端口更一劳永逸。但 VSCode 里有两处地方要设:一是调试配置里的 port,二是某些扩展(比如 Debugger for Chrome)自己的默认端口。光改 launch.json 不一定生效。
- 在项目根目录的
.vscode/launch.json中,确保port字段明确指定,如:"port": 3001 - Chrome 调试器还读取全局设置:
debug.javascript.chrome.port,可在 VSCode 设置里搜这个 key 直接改 - 某些前端框架 CLI(如
create-react-app)启动时硬编码端口,这时得在终端里加参数:npm start -- --port 3001
为什么改了端口还报错?检查 localhost vs 127.0.0.1 绑定差异
有时候你改了端口,重启后还是报占用——可能因为前一个进程绑定的是 0.0.0.0:3000,而新进程试图绑 127.0.0.1:3000,系统认为是不同地址,但实际端口冲突仍存在。更隐蔽的是,某些服务默认监听 ::1(IPv6 的 localhost),和 IPv4 的 127.0.0.1 看似不同,但端口共享。
- 查占用时用
lsof -iTCP -sTCP:LISTEN -n(macOS/Linux)或netstat -aon | findstr LISTENING(Windows),看 Address 列是*:3000还是127.0.0.1:3000 - Node.js 服务默认用
app.listen(3000)绑定0.0.0.0,想限定只本机访问,得写成app.listen(3000, '127.0.0.1') - VSCode 的调试器有时会自动 fallback 到 IPv6,关掉它:在
launch.json加"webRoot": "${workspaceFolder}", "address": "127.0.0.1"
端口冲突真正麻烦的不是找不到进程,而是多个服务交叉绑定、IPv4/IPv6 混用、还有 CLI 工具悄悄覆盖配置。盯住 PID 和 Address 两列,比反复重启 VSCode 有效得多。











