游客发表
开发机上8080端口又被占了。端口你敲下npm start,被占终端吐出一行红色报错——Error: listen EADDRINUSE: address already in use :::8080。用何这时候大多数人会直接关掉终端重开,释放或者重启电脑,端口但问题往往还在。被占真正的用何原因很简单:某个进程还攥着这个端口不撒手。
先看是释放谁占的。Windows上打开cmd,端口输入netstat -ano | findstr :8080,被占你会看到类似TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 12345的用何输出,最后一列那个数字就是释放进程PID。Linux或macOS用户则用lsof -i :8080,端口输出里会有PID和进程名。被占找到PID后,用何Windows用taskkill /PID 12345 /F强制结束,Unix系用kill -9 12345。
但别急着杀。我见过有人把数据库进程或者Docker容器直接干掉,结果整个开发环境崩了。先看一眼进程名——如果是个node进程,大概率是你之前某个没关干净的开发服务器;如果是java,可能是某个后台服务在跑。确认不是重要服务再动手,否则你会花半小时重启各种依赖。
有时候端口明明显示没被占用,但程序就是起不来。这多半是TIME_WAIT状态在搞鬼。TCP连接关闭后,端口会进入TIME_WAIT状态持续约两分钟,期间不能被重新绑定。这种情况等一会儿就好,或者你可以在代码里设置SO_REUSEADDR选项——Node.js里是server.listen(port, host, callback)之前加一句server.on('error', handler),但更直接的办法是换个端口先跑起来。
有个小技巧:如果你经常被这个问题困扰,干脆写个脚本一键搞定。我自己的做法是在.bashrc里加了个函数,输入killport 8080就自动找出PID并杀掉。Windows用户可以用PowerShell写个等价命令。这不算偷懒,是给自己省时间。
最后说个冷门的:有时候你杀掉了进程,端口还是占着。那是残留的socket文件在作怪。Linux下检查/tmp目录,删掉对应文件就行。Windows下则可能要重启一下WinNAT服务,特别是你用WSL2或Docker的时候。这种情况不常见,但遇到了会很抓狂。
端口冲突本质上是资源管理问题。每次遇到都去重启电脑,说明你还没掌握排查工具。花十分钟学会netstat和lsof的常用参数,比什么都管用。工具就摆在那里,用熟了就成肌肉记忆了。
友情链接