如何从错误中释放本地主机:监听EADDRINUSE


120

我正在测试Windows 7上用nodejs编写的服务器,当我尝试在命令行中运行测试器时,出现以下错误

Error: listen EADDRINUSE
at errnoException (net.js:614:11)
at Array.0 (net.js:704:26)
at EventEmitter._tickCallback (node.js:192:40)

如何在不重新启动的情况下进行修复?


9
sudo killall node可能会派上用场
Hashir Hussain

Answers:


101

这表示您正在尝试将服务器绑定到的地址。尝试另一个端口或使用该端口关闭程序。


使用端口3000我找不到任何东西,但是更改它确实有效!
丹尼斯

7
由于此单节点程序是在我的计算机上唯一使用端口3000的程序,因此很显然发生了一些事情,导致我的节点进程的先前实例无法正常关闭。当我使用node app.jsCtrl + C并停止使用它时,它可以正常工作,但是在我第一次使用后就开始出现EADDRINUSE问题npm start,因此看来真正的解决方案是使用Ctrl + C以外的其他功能来关闭它npm start
戴维·梅森

您的npm start脚本可能是多个节点程序,或者是在后台运行的节点程序,或者该程序可能包含使用该端口的子进程。
13年

1
通常,由于节点进程尚未终止而发生此错误。但是,有时其他进程正在使用该端口,因此可能很难理解/定位填充该端口的正确进程。下面的WolfReporter有针对此问题的正确解决方案!stackoverflow.com/a/22875192/36975
qualbeen

6
我做了ps aux | grep node,找到了进程ID(第二列),然后用kill <pid>(mine was kill 18762)将其杀死。
nik_m

168

跑:

ps -ax | grep node

您会得到类似以下内容:

60778 ??         0:00.62 /usr/local/bin/node abc.js

然后做:

kill -9 60778

谢谢!适用于我的机器!
olefrank '16

谢谢。这就是我所需要的。我安装了pm2,它在关闭时会自动启动节点应用程序。我必须禁用pm2才能自动启动节点。
KlevisGjN

作品!非常感谢
Wim den Herder

9
您如何在Windows上做到这一点?
威廉

kill -15 60778会好很多,因为SIGTERM如果发送SIGKILL
praj

39

在Linux上(至少是Ubuntu衍生产品)

killall node

比这种形式容易。

ps | grep <something>
kill <somepid>

如果您有一个孤立的孩子拿着港口,那么两者都不起作用。相反,请执行以下操作:

netstat -punta | grep <port>

如果端口被保留,您将看到以下内容:

tcp           0      0.0.0.0:<port>          0.0.0.*       LISTEN     <pid>/<parent>

现在被pid杀死:

kill -9 <pid>

1
这应该标记为完整答案。就我而言,这也是一个孤儿。这就是他们所说的僵尸进程吗?
Nithish追求幸福2015年

1
出乎<pid>/<parent>我意料的是-
弗朗西斯科·科拉莱斯·莫拉莱斯

35

以下命令将为您提供正在运行的节点进程的列表。

ps | grep node

要释放该端口,请使用以下命令停止该过程。

kill <processId>

3
您可能需要添加一个| grep -v grep以排除该grep过程。
加勒特·海德

6
就像原始海报写道:“在Windows 7上... ...-)
Golo Roden

4
更好的选择是pidof node
Itay Grudev

pidof很容易安装,我与自制OSXbrew install pidof
electblake

1
如果您正在运行更多的应用程序,那么仅是节点应用程序,则该地址可能已绑定到其他应用程序。搜索绑定到您要启动的端口的pid会更好吗?即:对于Linux,您可以使用netstat -lnptu | grep端口号。不确定Windows的等效项是什么。
克里斯斯特

31

您收到错误消息EADDRINUSE是因为您的应用程序要使用的端口已被另一个进程占用。要释放此端口,您需要终止占用过程。

由于您使用的是Windows,因此可以使用命令提示符(cmd)终止该过程。使用,cmd您可以发现阻止应用程序的进程ID(PID)。您将需要PID才能终止/终止进程。

这是逐步指南...

  1. 查找在指定端口上运行的所有进程(在此示例中,端口为“ 3000”):

    netstat -ano | 找到“:3000”

  2. netstat命令将列出在指定端口上运行的所有进程。在结果的最后一栏中,netstat您可以看到PIDs(在此示例中,PID为“ 8308”)。您可以PID通过运行以下命令来查找有关特定内容的更多信息:

    任务列表/ fi“ pid eq 8308”

  3. 如果要终止进程,则可以使用以下命令来执行PID此操作(在此示例中,PID为“ 8308”):

    taskkill / pid 8308 / f

屏幕截图

在此处输入图片说明


1
扎实的解释。
Joe Healy

19

当您收到错误消息错误:监听EADDRINUSE,

尝试运行以下shell命令:

netstat -a -o | grep 8080
taskkill /F /PID 6204

grep使用8080,因为我知道我的服务器正在8080端口上运行。(static启动时会告诉我:“在http://127.0.0.1:8080上提供“。” 。)您可能必须搜索其他内容港口。


1
最后!按端口而不是按过程搜索的答案。绑定端口的不仅仅是节点!
Michael Scheper

我制作了一个模块来检测哪个运行进程正在锁定端口,称为porthog。它基本上执行上面的代码。
科里

15

假设您的服务器正在运行 port 3000

lsof -i tcp:3000
    COMMAND   PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
    node    11716 arun   11u  IPv6 159175      0t0  TCP *:3000 (LISTEN)

在使用之后 kill -9 <pid>

在上述情况下 sudo kill -9 11716





6

当您遇到错误时

错误:听EADDRINUSE

打开命令提示符并键入以下说明:

netstat -a -o | grep 8080
taskkill /F /PID** <*ur Process ID no*>

之后,重新启动手机差距界面。

如果您想知道phonegap使用的是哪个进程ID,请打开TASK MANAGER,查看列标题PID,找到PID号。


我无法使taskkill正常工作,因此我打开了任务管理器并添加了PID并在那里杀死了它
Tom Stickel

5

killall -9Patrick所建议的上述节点可以按预期工作,并且可以解决问题,但是您可能希望阅读此答案的编辑部分,以了解为什么kill -9不是最佳方法。

最重要的是,您可能希望针对单个进程,而不是盲目地杀死所有活动进程。

在这种情况下,首先获取在该端口上运行的进程的进程ID(PID)(例如8888):

lsof -i tcp:8888

这将返回类似:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1

(听)然后就做(ps-实际上不行。请继续阅读下面的内容):

kill -9 57385

4

在Mac上可以使用:

第1步。

sudo lsof -i tcp:3000 (or whatever port you want to kill)

上面的命令将为您提供当前持有该端口的进程ID。

第2步。

Kill -9 <pid>

3

您可以在app.js或您的项目配置文件中更改端口。

默认值('port',80)

并查看端口80是否已在使用中,您可以执行

netstat -antp | grep 80

netstat -antp | grep节点

您可能想查看节点进程是否已在运行。

ps -ef | grep节点

如果发现它已经在运行,则可以使用

Killall节点


1

我创建了2台服务器,在相同的端口8081上侦听,使用相同的代码运行,同时学习

第一个服务器创建工作正常,第二个服务器创建失败,出现EADDRINUSE

node.js回调延迟可能是无法运行或第二台服务器创建异常并退出程序的原因,因此第一台服务器也已关闭

2服务器问题提示,我来自: 如何解决错误:使用nodejs时听EADDRINUSE?


1

错误:听EADDRINUSE来解决它在Ubuntu运行在终端netstat -nptl 并在此之后kill -9 {process-number}这个命令是杀死节点的过程,现在你可以尝试再次运行节点server.js命令

防爆

听EADDRINUSE ::: 8080

netstat -nptl

tcp6 0 0 ::: 9000 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 5800 ::: * LISTEN-
tcp6 0 0 ::: 5900 ::: * LISTEN-
tcp6 0 0 ::: 8080 :: :* LISTEN 10401 /节点
tcp6 0 0 ::: 20080 ::: * LISTEN 9660 / java
tcp6 0 0 ::: 80 ::: * LISTEN-
tcp6 0 0 ::: 22 ::: * LISTEN-
tcp6 0 0 ::: 10137 ::: *听9660 / java

杀死-9 10401


2
用户说它在Windows上。在Windows上netstat接收不同的参数。netstat -a -p tcp -b -v将输出进程名称。
arboreal84

0

我在Mac和Raspberry Pi上安装了节点红色。遇到了完全相同的问题,执行“ killall”并没有帮助。一旦我关闭了Raspberry Pi并重新启动计算机,它就可以正常工作。



0

对于已经尝试了上述所有操作但仍无法找到胭脂过程的任何人,请再次尝试所有步骤,但请确保在命令前面包含“ sudo”。


0

如果您更喜欢UI,请在Windows任务管理器中找到进程Node.js并将其杀死。


0

ps -ef | grep节点找到app.js,杀死app.js的pid




0

[解决了]

可能为时已晚,但它就像一种魅力。

您需要pm2安装

npm install -g pm2

要停止当前正在运行的服务器(server.js):

pm2 stop -f server.js

0

我已经通过在package.json中添加以下内容来解决此问题,以杀死活动的PORT-在WSL2 / Linux / Mac上运行的4000(对于我而言)

"scripts": {
    "dev": "nodemon app.js",
    "predev":"fuser -k 4000/tcp && echo 'Terminated' || echo 'Nothing was running on the PORT'",
  }

资源


-1

要杀死节点服务器,请首先在终端中运行以下命令:

  1. top
  2. 打开另一个窗口,然后id从上一个窗口复制服务器:PID number -9 kill 所以现在您杀死了节点服务器,然后再次尝试运行您的应用程序。

-1

我使用命令netstat -ano | grep "portnumber"来列出该进程的端口号/ PID。然后,您可以taskkill -f //pid 111111用来终止进程,最后一个值是从第一个命令中找到的pid。

我有时遇到的一个问题是,即使在终止进程之后,也会重新生成节点,因此我必须使用良好的旧任务管理器来手动终止节点进程。


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.