节点/快速:EADDRINUSE,地址已在使用 - 终止服务器

Node / Express: EADDRINUSE, Address already in use - Kill server

提问人:Skawful 提问时间:11/2/2010 更新时间:9/6/2023 访问量:1533301

问:

我有一个简单的服务器使用 connect 在 node.js 中运行:

var server = require('connect').createServer();
//actions...
server.listen(3000);

在我的代码中,我有实际的处理程序,但这是基本思想。我不断遇到的问题是

EADDRINUSE, Address already in use

在之前崩溃或错误后再次运行应用程序时,我收到此错误。由于我没有打开终端的新实例,因此我用 关闭了该过程。ctr + z

我相当确定我所要做的就是关闭服务器或连接。我试着打电话,但没有运气。server.close()process.on('exit', ...);

节点 .js

评论

61赞 nacho4d 11/14/2011
实际上,您应该使用哪个将通过发送 SIGQUIT :)来正确关闭程序有关更多详细信息,请参阅 wiki :)Ctrl + zCtrl + c
2赞 Xedecimal 2/27/2012
你是说SIGINT。SIGQUIT 是由于 'ctrl + \'
97赞 Gerard 11/21/2013
尝试或是否在类 UNIX 操作系统上pkill nodejspkill node
2赞 Jazzy 8/1/2017
我遇到了类似的问题,并找到了这个包,它可以让您在 CTRL+C 时干净地退出:npmjs.com/package/exit-hook
4赞 Chris Hawkes 2/18/2020
重新启动计算机是一个糟糕的解决方案。

答:

41赞 Shripad Krishna 11/3/2010 #1

Linux操作系统

运行并确定节点进程的 PID。ps

然后,运行sudo kill PID

窗户

使用 tasklist 显示正在运行的进程列表:

tasklist /O

然后,像这样杀死节点进程(使用从命令中获取的 PID):tasklist

taskkill /pid PID

评论

1赞 Trevor 3/19/2016
如果在 Windows 上?
1赞 nawlbergs 8/23/2017
请注意...出于某种原因,我不得不在来自 git-bash 的 taskkill 命令的标志上使用双斜杠:我刚刚杀死了节点。工作。taskkill //IM node.exe
1赞 Stepan Poperechnyi 5/27/2022
文档中没有 /O 参数 learn.microsoft.com/en-us/windows-server/administration/...
180赞 Tor Valamo 11/3/2010 #2

process.on('exit', ..)如果进程崩溃或终止,则不会调用。它仅在事件循环结束时调用,并且由于某种程度上结束了事件循环(它仍然必须等待当前在这里和那里运行的堆栈),因此将其放在退出事件中是没有意义的......server.close()

崩溃时,执行和终止执行process.on('uncaughtException', ..)process.on('SIGTERM', ..)

话虽如此,SIGTERM(默认终止信号)允许应用程序清理,而 SIGKILL(立即终止)不会让应用程序执行任何操作。

评论

6赞 farincz 10/16/2015
它对 process.on('SIGINT', ... ) 也很有用
655赞 djburdick 11/23/2010 #3

您也可以转到命令行路由:

ps aux | grep node

获取进程 ID。

然后:

kill -9 PID

在 kill 时执行 -9 会发送一个 SIGKILL(而不是 SIGTERM)。 SIGTERM 有时被节点忽略了。

评论

2赞 Jean Jordaan 3/14/2011
ps aux | grep node什么也没显示;仍然失败:3 月 14 日 21:19:30 - socket.io 就绪 - 接受连接 现在可以启动服务器:EADDRINUSE,地址已在使用中textareaserver --editor-cmd='gvim -f'
147赞 Martin Josefsson 11/27/2013
为什么这样而不是killall -9 node
36赞 lukejacksonn 1/12/2016
我用了这个答案很长一段时间,然后有一天为了方便起见,把它组合成一个衬里。.此命令将终止在给定端口(本例中为 8000)上运行的任何进程:lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
3赞 tuliomir 1/6/2019
我同时运行了多个节点服务器,其中一些是 Electron 应用程序。我不得不只使用特定的进程 ID 而不是 .killkillall
1赞 Maxim 11/19/2019
就像 PSA 一样:要非常小心你杀死的内容,因为许多服务使用 Electron,你可能会无意中杀死一个不相关的进程。
295赞 Sushil 5/8/2013 #4

我在运行 win8 的笔记本电脑上击中了这个。这奏效了。

以“管理员”身份运行 cmd.exe:

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.

评论

1赞 Bertus Kruger 5/11/2015
我从命令窗口运行它并意外关闭了它。节点在后台继续运行...(即使在会话终止后)。就我而言,一旦我关闭了通过网络套接字连接到它的浏览器选项卡,它最终终止了。
27赞 Marty McGee 6/24/2015
taskkill /F /IM node.exe对我来说,就像来自任何目录的 Windows 上的魅力一样:-)感谢您的分享!
5赞 Code Whisperer 9/7/2016
这是我能够针对 Windows 验证的唯一单行工作解决方案
8赞 Glenn Werner 7/18/2017
适用于 Windows 10。顺便说一句,我不必以管理员身份运行 cmd.exe。
2赞 David Klempfner 8/17/2021
这是最好的答案。其他人给了我“无法识别的命令”。这很有效。
4赞 touchStone 9/14/2013 #5

您可以使用热节点来防止服务器崩溃/运行时错误。每当节点程序[源代码] / 进程[正在运行的节点程序] 发生更改时,Hot-node 会自动为您重新启动 nodejs 应用程序。

使用 npm 使用 global 选项安装 hot-node:

npm install -g 热节点

评论

0赞 Lucas 7/24/2014
PM2是更好的选择。更强大,更多选择。并且以 Forever 的 root 身份运行时没有问题。
0赞 GPX 2/5/2015
@Lucas 你说的这个根本问题是什么?不幸的是,我被迫在工作中的产品上永久使用而不是 pm2(由于一些许可废话),这让我非常担心!
23赞 Kit 3/30/2015 #6

我曾经遇到过这个错误,并在这里采用了许多方法。

我的问题是我有两个app.listen(3000;在同一个app.js脚本中调用。第一个 app.listen() 成功,第二个 app.listen() 抛出错误。

我遇到的另一个帮助我调试的有用命令是它将杀死您可能已启动的任何流氓进程(某些进程可能会重新启动,例如,如果使用 forever.js 运行,但它对我有用)。sudo fuser -k 3000/tcp

评论

0赞 Asqan 3/12/2019
同样的问题在这里...奇怪的是,它在调试中正常工作,同时出现此错误以运行npm start
9赞 Idan Yehuda 2/17/2016 #7

任务管理器 (ctrl+alt+del) ->

“进程”选项卡 ->

选择“节点.exe”进程并点击“结束进程”

评论

0赞 Jimmy Obonyo Abor 10/2/2016
如果我想要的是杀死一个节点端口进程,为什么要杀死整个节点进程。
0赞 tripleee 1/15/2021
这没有意义,没有单独的过程来保持端口。如果您有多个进程访问不同的端口,或者根本没有访问,则必须挑出保留该端口的进程;但这仍然只是一个过程。nodenode
17赞 Dat TT 5/17/2016 #8

仅供参考,您可以在一个命令中终止该进程。这可以用于所有其他端口,如 8000、8080 或 9000,这些端口通常用于开发。sudo fuser -k 3000/tcp

101赞 ali ozkara 12/25/2016 #9

我找到了这个解决方案,试试吧 授予使用权限sudo

  sudo pkill node

评论

1赞 IgorGanapolsky 3/15/2017
我仍然看到带有此命令的节点进程:ps aux | grep node
5赞 Amal Augustine Jose 3/15/2017 #10

在适当尊重表格中所有答案的情况下,我想补充一点。

我发现当我使用 Ctrl + Z 错误地终止节点应用程序时,下次我尝试打开它时会出现相同的错误 EADDRINUSE。

当我使用 Ctrl + C 终止节点应用程序时,下次打开它时,它顺利完成。

将端口号更改为错误端口号以外的端口号解决了该问题。

评论

1赞 vipulnj 6/10/2017
Ctrl + C 是正确的。我使用了与以前相同的端口号,并且它和以前一样工作。
2赞 Alexis Wilke 1/18/2019
<键>Ctrl-Z</键>不会停止该过程。它将其置于后台,以便您可以运行其他命令。这是一个 Unix shell 的东西。若要继续该过程,请在同一控制台中使用。然后,在命令行中键入各种命令后,您可以查看该服务器中发生的情况。fg
875赞 Mina Gabriel 4/21/2017 #11

首先,您想知道哪个进程正在使用port 3000

sudo lsof -i :3000

这将列出在此端口上侦听的所有 PID,一旦您拥有 PID,您可以使用以下命令终止它:

kill -9 <PID>

其中,将上一个命令输出替换为进程 ID 或进程 ID 列表。<PID>

评论

51赞 Phil Gibbins 1/15/2018
此命令清楚地标识了 PID,这与我的输出不同。我也不需要ps aux | grep nodesudo
10赞 Fernando Barbosa 3/5/2020
这是最好的答案。使用带有纱线的 React Native 端口 8081 对我来说效果很好。
1赞 Campalo 3/12/2020
这对我来说效果很好。我可以确定端口 3000 的使用位置并关闭它。我也不需要.sudo
4赞 STREET MONEY 4/22/2020
很好。我也在获得命令后进行了尝试,例如killall -9 {COMMAND}killall -9 node
2赞 Caleb Thornton 11/6/2020
使用特定端口查找进程的命令非常有用。很高兴你发布了这个。
14赞 var foobar 6/1/2017 #12

PowerShell 用户:

任务终止 /IM 节点.exe /F

9赞 Arun Killu 7/1/2017 #13

以防万一,检查您是否错误地多次添加了此行

app.listen(3000, function() {
  console.log('listening on 3000')
});

上面的代码是用于快速的,但只需检查您是否尝试在代码中使用同一端口两次即可。

146赞 Ayan 11/17/2017 #14

使用以下命令检查 PID,即在端口 3000 上运行的进程的 ID:

lsof -i tcp:3000

它将输出如下内容:

COMMAND  PID   USER   FD   TYPE  DEVICE  SIZE/OFF NODE NAME
node     5805  xyz    12u  IPv6  63135    0t0     TCP  *:3000 (LISTEN)

现在使用以下命令终止进程:

kill -9 5805

评论

3赞 x89 1/23/2020
如果我使用 lost,我没有得到任何输出。这是否意味着该部分没有流程?
2赞 tripleee 1/15/2021
除非您知道自己在做什么,否则不要使用。基本上,试着等一会儿,如果这个过程还在,那就拿出大枪。无条件地终止进程不会让它进行任何清理,这可能会导致文件句柄泄漏和争用条件等。或者导致“地址已在使用中”。kill -9kill PIDkill -2 PIDkill -15 PID
0赞 jscul 7/14/2021
我没有得到lsof的输出...但问题仍然存在。
38赞 floribon 9/15/2018 #15

这是一个单行(将 3000 替换为端口或配置变量):

kill $(lsof -t -i:3000)

评论

0赞 Ryan 10/25/2022
kill $(lsof -t -i:8080)使用 Mongo 运行 Node.js Express 应用程序时为我工作。
16赞 ejntaylor 12/11/2018 #16

首先找出正在运行的内容:

sudo lsof -nP -i4TCP:3000 | grep LISTEN

你会得到类似的东西:

php-fpm 110 root    6u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 274 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)
php-fpm 275 _www    0u  IPv4 0x110e2ba1cc64b26d      0t0  TCP 127.0.0.1:3000 (LISTEN)

然后,您可以按如下方式终止该过程:

sudo kill 110

然后,您将能够在不出现侦听EADDRINUSE :::3000错误的情况下运行

评论

0赞 primegxy 12/1/2019
我正在使用 nodemon,它再次重新启动服务。他们有什么办法杀死诺恶魔吗?
38赞 Shahdat 1/29/2019 #17

对于Windows,打开任务管理器并查找node.exe进程。用结束任务杀死他们所有人。

enter image description here

评论

0赞 Leon Africa 7/31/2021
更新:“Node.js JavaScript 运行时”的结束任务就足够了
0赞 MELLAL Fethi 12/21/2021
已经 11 年了,仍然有用,这是 Windows 的最佳答案。
22赞 jmrueda 2/10/2019 #18

对于像我这样的 Visual Studio 菜鸟

您可能正在其他终端中运行该进程!

Visual Studio关闭终端后,终端就会消失

手动创建了一个新的,以为前一个被销毁了。实际上,每次我单击“新建终端”时,我实际上都在以前的终端之上创建一个新终端

所以我找到了第一个终端,然后......瞧,我在那里运行服务器。

multiple terminals withot realizying it

20赞 Adam Gerard 6/21/2019 #19

您可能会遇到这样的情况,即即使杀死线程或进程实际上也不会终止应用程序(这种情况在 Linux 和 Windows 上偶尔发生)。有时,您可能已经有一个实例正在运行,但您没有关闭。

由于这些情况,我更愿意在我的:package.json

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},

然后,我可以使用以下命令来称呼它们:

npm run stop-win
npm run stop-Linux

如果需要,您可以更高级,并使用参数标志创建这些 BIN 命令。您还可以将这些命令添加为要在 try-catch 子句中执行的命令。

18赞 Daniyal 7/26/2019 #20
ps aux | grep node
kill -9 [PID] (provided by above command)

描述:


  1. ps 会给出进程状态,aux 提供 a:所有用户进程,u:用户自己的进程,x:未附加到终端的所有其他进程的列表。
  2. 管道符号: |将传递 PS AUX 的结果以进一步操作。
  3. grep 将从 PS aux 提供的列表中搜索提供的字符串(在我们的例子中为 node)。

评论

0赞 tripleee 1/15/2021
除非您知道自己在做什么,否则不要使用。基本上,试着等一会儿,如果这个过程还在,那就拿出大枪。无条件地终止进程不会让它进行任何清理,这可能会导致文件句柄泄漏和争用条件等。或者导致“地址已在使用中”。kill -9kill PIDkill -2 PIDkill -15 PID
13赞 SendETHToThisAddress 3/5/2020 #21

UI解决方案 对于Windows用户:我发现顶级答案对我不起作用,它们似乎是Mac或Linux用户的命令。我找到了一个简单的解决方案,不需要任何命令来记住:打开任务管理器(ctrl + shift + esc)。查看正在运行的后台进程。查找任何 Node.js 并结束任务。

在我这样做之后,问题对我来说就消失了。如其他答案所述,由于之前遇到错误并且未调用常规退出/清理功能,因此后台进程仍在运行,因此杀死它们的一种方法是在任务管理器中找到该进程并在那里杀死它。如果从终端/powerShell 运行该进程,通常可以使用 ctrl+c 来终止它。

7赞 Najathi 4/3/2020 #22

在Windows用户中:打开文件,它工作正常。task managerend tasknodejs.exe

47赞 Deepam Gupta #23

在我的回答中重写@Gerard的评论

尝试或是否在类 UNIX 操作系统上。pkill nodejspkill node

这将终止运行在任何端口上运行的节点服务器的进程。 为我工作。

15赞 Yanov 5/12/2020 #24
bash$ sudo netstat -ltnp | grep -w ':3000'
 - tcp6    0      0 :::4000      :::*        LISTEN      31157/node      

bash$ kill 31157
8赞 Raghav 1/19/2021 #25

在 Windows 上,我收到以下错误:

EADDRINUSE:地址已在使用中:::8081。

按照下列步骤操作:

  • 以管理员身份打开CMD
  • 运行了以下内容

命令 netstat -ano|findstr “PID :8081”

得到了以下过程:

enter image description here

通过以下方式杀死了它:

任务杀戮 /PID 43144 /F

enter image description here

在MAC上,您可以这样做:

raghavkhunger@MacBook-空气 ~ % lsof -i tcp:8081 命令 PID 用户 FD 类型 设备大小/关闭节点名称 节点 23722 用户名 24u IPv6 0xeed16d7ccfdd347 0t0 TCP *:sunproxyadmin (LISTEN)

username@MacBook-空气 ~ % 杀伤 -9 23722

22赞 Ezra Siton 3/9/2021 #26

Cmd 的 Windows

1/2. 搜索 => 写入 cmd => 打开node.js command prompt

enter image description here


2/2. 运行 windows 命令:taskkill

结束一个或多个任务或进程。

taskkill /f /im node.exe

/f- 强制结束

/im- 指定要终止的进程的映像名称。

node.exe-可执行文件

enter image description here

Windows - Mannualy by 任务管理器

此命令与转到详细信息选项卡下并选择任务(在我看来很整洁)相同。Task Managernode

enter image description here

end task

enter image description here

Visual Studio

有时有多个终端/任务(客户端/服务器等)。 选择并关闭 。ctrl + c

enter image description here

5赞 Salah Ben Bouzid 7/3/2021 #27

使用 netstat 获取所有节点进程及其正在使用的端口,然后通过 PID 杀死您唯一想要的进程

netstat -lntp | grep node

您将获得所有节点进程

tcp6  0      0 :::5744    :::*    LISTEN     3864/node

然后当你得到 PID (3864) 时,只需通过 PID 杀死进程

  kill -HUP PID 
115赞 Fatih Bulut 10/29/2021 #28

对于 macOS Monterey(12.0):

Apple 在 macOS Monterey 上为 AirPlay 引入了一些更改。现在,它使用 5000 和 7000 端口。如果在项目中使用这些端口,则需要禁用此功能。

系统偏好设置 > 共享 > 取消勾选“隔空播放接收器”


对于 macOS Ventura(13.0) 及更高版本的用户:

系统设置>常规>禁用 AirPlay 接收器

评论

0赞 Salvador 3/20/2023
它工作的朋友,只需在 MacOS Ventura 中寻找“接收器”,因为界面发生了变化
84赞 malik kurosaki 1/24/2022 #29

我通常使用

npx kill-port 3000

或在我的 Mac 上。

killall node

评论

0赞 Hender 9/5/2023
如果你做 killall node,它很可能会杀死 nodejs 实例,这些实例运行例如 react apps。
20赞 Mrk Fldig 9/22/2022 #30

真的很简单,适用于所有操作系统的 ..

npx kill-port 3000

尽管您的问题如上所述,但您需要捕获节点退出的不同方式,例如

process.on('uncaughtException', (err, origin) => {
    console.log(err);
});

// insert other handlers.