尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

起服务报 EADDRINUSE 端口被占用,我重启了三次电脑

起服务报 EADDRINUSE 端口被占用,我重启了三次电脑 前天晚上我在弄一个大二闲下来想练手的小东西一个本地跑的待办清单页面前端后端都在我自己这台电脑上。写完一段想看下效果就在终端敲了启动命令回车。然后它报错了。报错不是那种一眼能看懂的类型。终端里滚出来一大串我能认出来的只有最后那行的端口号 8080旁边那个 EADDRINUSE 我当时完全不知道是什么东西。我第一反应是电脑卡住了。于是我把服务关掉重新敲了一遍命令。还是这个错。我当时也没多想觉得可能是刚才那次没关干净那重启一下电脑就好了重启完什么残留都没了。坐在那儿等开机进度条慢慢转完期间一直盯着屏幕心里想这下总可以了。开机之后我又把服务跑起来能跑了。本来以为这就翻篇。结果过了两天又碰上同样的事我又重启了一次。等到第三次的时候我才停下来问自己我这两天到底在干嘛。$ npm run devdevnode server.jsError: listen EADDRINUSE: address already in use :::8080at Server.setupListenHandle [as _listen2] (net.js:1313:16)那个 8080 到底是什么后来老老实实去翻了文档和别人的踩坑帖。道理其实特别简单8080 就是一个门牌号你起服务等于在这条街上占了个门面门面已经有人了你当然进不去。报错说的就是这个门牌号被占了。问题是我根本不知道怎么查是谁占的。这一步我之前完全跳过一出错就直接重启。macOS 和 Linux 上可以这样看macOS / Linux谁占着 8080 这条街lsof -i :8080Linux 上也可以看清楚是哪个进程ss -lntp | grep 8080Windows 换成这个最后一列就是 PID我盯了半天才认出来netstat -ano | findstr :8080lsof -i :8080 会把占用这个端口的进程列出来。我第一次看的时候盯着其中一列数字愣了半天后来才知道那是 PID进程号。帖子里说拿这个号去把进程结束掉我照着敲了一遍才慢慢明白它在干什么。这里有个坑看到 PID 别急着杀。先看那一行最前面写的进程名是什么。我那次看到的进程名就是我自己前一次跑起来、根本没关掉的服务。我以为我关掉了那为什么我明明关了它还在因为按 CtrlC 之后终端是退出来了但服务其实是包在一层启动脚本里跑的我结束掉的只是外面那层真正占端口的那个小进程还在后台待着。用 npm run dev 起服务经常是这样。类似的情况还有你之前拿 nohup 或者加个 把它挂在后台关窗口的时候把它忘了。确认是自己留下的就可以结束了。macOS 和 Linux 是 kill 后面跟 PID它要是不退就 kill -9这个是强制的。Windows 上换成 taskkill。macOS / Linux先温柔一点PID 换成你查到的那个kill 12345它赖着不走再强制kill -9 12345Windowstaskkill /PID 12345 /F如果占端口的不是我自己的东西呢。有时候是另一个项目也在用这个端口甚至是不认识的系统进程。这种就别去动它改自己项目的端口更省事8080 改成 8081跑起来就行没必要为了一个数字去跟别人的进程较劲。话说回来重启电脑确实有用进程跟着系统一起没了端口自然就空出来。它能把这一次糊弄过去下次还是会撞上。换个端口就能跑那为什么还要花时间去查因为在别人电脑上在 CI 里在服务器上你没法重启只能知道怎么办。现在我再起服务之前会先看一眼那个端口有没有人。也不是每次都查就是报过一次错之后心里大概有个数了。
返回列表