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

Ska*_*ful 370 node.js

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

var server = require('connect').createServer();
//actions...
server.listen(3000);
Run Code Online (Sandbox Code Playgroud)

在我的代码中,我有实际的处理程序,但这是基本的想法.我一直遇到的问题是

EADDRINUSE, Address already in use
Run Code Online (Sandbox Code Playgroud)

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

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

djb*_*ick 435

你也可以去命令行路线:

ps aux | grep node
Run Code Online (Sandbox Code Playgroud)

获得流程ID.

然后:

kill -9 PID
Run Code Online (Sandbox Code Playgroud)

在kill上执行-9会发送SIGKILL(而不是SIGTERM).有时我会忽略节点对SIGTERM的忽略.

  • 为什么这不是`killall -9 node` (52认同)
  • 我使用这个答案很长一段时间,然后有一天为了方便起见将它组成一个单行程序.这个命令会杀死在给定端口上运行的任何进程(本例中为8000):`lsof -n -i4TCP:8000 | grep LISTEN | tr -s''| cut -f 2 -d''| xargs kill -9` (22认同)
  • 我同时运行多个节点服务器,其中一些是 Electron 应用程序。我必须只使用带有特定进程 ID 的“kill”,而不是“killall”。 (3认同)
  • `ps 辅助| grep node`什么也没显示;仍然 `textareaserver --editor-cmd='gvim -f'` 失败:3 月 14 日 21:19:30 - socket.io 就绪 - 接受连接 现在可以启动服务器:EADDRINUSE,地址已在使用中 (2认同)

Tor*_*amo 132

process.on('exit', ..)如果进程崩溃或被杀死,则不会被调用.当事件循环结束它只是调用,因为server.close() 排序结束事件循环(它仍必须等待目前在这里和那里运行栈)是没有意义把该退出事件中...

在崩溃,做process.on('uncaughtException', ..)和杀做process.on('SIGTERM', ..)

话虽这么说,SIGTERM(默认终止信号)让应用程序清理,而SIGKILL(立即终止)不会让应用程序做任何事情.

  • 它对process.on('SIGINT',...)也很有用 (3认同)

Sus*_*hil 132

我在运行win8的笔记本电脑上点击了这个.这很有效.

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

C:\Windows\System32>taskkill /F /IM node.exe
SUCCESS: The process "node.exe" with PID 11008 has been terminated.
Run Code Online (Sandbox Code Playgroud)

  • `taskkill/F/IM node.exe`就像我在Windows上从任何目录的魅力:-)感谢分享!! (5认同)
  • 在Windows 10上可以使用。我不必以管理员btw身份运行cmd.exe。 (4认同)
  • 这是我能够验证Windows的唯一单线工作解决方案 (2认同)
  • 这是最好的答案。其他人给我“无法识别命令”。这才有效。 (2认同)

Min*_*iel 132

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

sudo lsof -i :3000
Run Code Online (Sandbox Code Playgroud)

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

kill -9 {PID}
Run Code Online (Sandbox Code Playgroud)

  • 与`ps aux |的输出不同,该命令清楚地标识PID grep node`对我来说.我也不需要`sudo` (10认同)
  • 很好。我在获得命令“killall -9 {COMMAND}”后也尝试过,例如“killall -9 node” (4认同)
  • 这是完美的答案 (3认同)
  • 这是最好的答案。使用 React Native 和纱线,在端口 8081 上工作得很好。 (3认同)
  • 这是唯一对我有效的答案。绝对应该是公认的答案。 (2认同)
  • 查找使用特定端口的进程的命令非常有用。很高兴你发布了这个。 (2认同)

Fat*_*lut 117

对于macOS 蒙特利(12.0):

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

系统偏好设置 > 共享 > 取消勾选 AirPlay 接收器


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

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


mal*_*aki 87

我通常使用

npx kill-port 3000
Run Code Online (Sandbox Code Playgroud)

或者在我的Mac上。

killall node
Run Code Online (Sandbox Code Playgroud)


Aya*_*yan 56

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

lsof -i tcp:3000
Run Code Online (Sandbox Code Playgroud)

它会输出如下内容:

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

现在使用以下方法终止进程

kill -9 5805
Run Code Online (Sandbox Code Playgroud)

  • 如果我使用lost,我不会得到任何输出。这是否意味着该部分没有流程? (3认同)
  • 除非您知道自己在做什么,否则不要使用“kill -9”。基本上,尝试“kill PID”和“kill -2 PID”和“kill -15 PID”并等待一段时间,如果进程仍然存在,*然后*拿出大枪。无条件终止进程不会让它进行任何清理,这可能导致文件句柄泄漏和竞争条件等。或者导致“地址已在使用中”。 (2认同)

Dee*_*pta 42

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

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

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


ali*_*ara 32

我找到了这个解决方案,试试吧给予许可使用 sudo

  sudo pkill node
Run Code Online (Sandbox Code Playgroud)


Shr*_*hna 25

你在Linux或Windows上吗?如果在linux上输入:ps并检查节点进程的PID.

然后, sudo kill PID

编辑:对于Windows:

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

tasklist

然后像这样终止节点进程(从ps命令中获取PID ):

sudo kill PID

  • 文档中没有 /O 参数 https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/tasklist (2认同)

Mrk*_*dig 20

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

npx kill-port 3000
Run Code Online (Sandbox Code Playgroud)

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

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

// insert other handlers.
Run Code Online (Sandbox Code Playgroud)


Kit*_*Kit 16

我曾经遇到过这个错误并在这里采取了很多方法.

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

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


Ada*_*ard 16

您可能会遇到即使终止线程或进程也不会真正终止应用程序的情况(这对我来说在 Linux 和 Windows 上每隔一段时间就会发生一次)。有时,您可能已经运行了一个未关闭的实例。

由于这些情况,我更愿意添加到我的package.json

"scripts": {
    "stop-win": "Taskkill /IM node.exe /F",
    "stop-linux": "killall node"
},
Run Code Online (Sandbox Code Playgroud)

然后我可以使用以下方法调用它们:

npm run stop-win
npm run stop-Linux
Run Code Online (Sandbox Code Playgroud)

如果您愿意,您可以变得更漂亮,并使用参数标志制作这些 BIN 命令。您还可以将这些添加为要在 try-catch 子句中执行的命令。


MD *_*YON 16

在 Linux 中尝试

pkill nodejs 
//or 
pkill node
Run Code Online (Sandbox Code Playgroud)

注意这将杀死所有进程

删除一些特定的端口

// This will show all the port number which node js is using
netstat -lntp | grep node
// Kill your targeted used port
kill -HUP process_id 
Run Code Online (Sandbox Code Playgroud)

  • 这应该被接受的答案。 (2认同)

flo*_*bon 14

这是一个衬垫(用端口或配置变量替换3000):

kill $(lsof -t -i:3000)
Run Code Online (Sandbox Code Playgroud)


小智 13

bash$ sudo netstat -ltnp | grep -w ':3000'
 - tcp6    0      0 :::4000      :::*        LISTEN      31157/node      

bash$ kill 31157
Run Code Online (Sandbox Code Playgroud)


tec*_*n23 12

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

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


Ezr*_*ton 11

通过 Cmd 窗口

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

在此处输入图片说明


2/2。运行windows命令:taskkill

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

taskkill /f /im node.exe
Run Code Online (Sandbox Code Playgroud)

/f - 强制结束

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

node.exe - 可执行文件

在此处输入图片说明

Windows - 任务管理器手动

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

在此处输入图片说明

end task

在此处输入图片说明

视觉工作室

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

在此处输入图片说明


小智 10

PowerShell用户:

Taskkill/IM node.exe/F.


Sha*_*dat 10

对于Windows,请打开任务管理器并找到node.exe进程。使用“结束任务”杀死所有人。

在此处输入图片说明


Dat*_* TT 9

仅供参考,你可以在一个命令中杀死进程 sudo fuser -k 3000/tcp.这可以通过常用于开发的所有其他端口(如8000,8080或9000)完成.


rai*_*son 9

首先找出正在使用什么:

sudo lsof -nP -i4TCP:3000 | grep LISTEN
Run Code Online (Sandbox Code Playgroud)

您将得到类似:

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)
Run Code Online (Sandbox Code Playgroud)

然后,您可以按以下步骤终止该进程:

sudo kill 110
Run Code Online (Sandbox Code Playgroud)

然后,您将能够运行而不会出现侦听EADDRINUSE ::: 3000错误


小智 8

ps aux | grep node
kill -9 [PID] (provided by above command)
Run Code Online (Sandbox Code Playgroud)

描述:


  1. ps将提供进程状态,aux提供以下列表:所有用户进程,u:用户自己的进程,x:未连接到终端的所有其他进程。
  2. 管道符号:| 将通过ps aux的结果进行进一步操作。
  3. grep将从ps aux提供的列表中搜索提供的字符串(在本例中为node)。


Rag*_*hav 8

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

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

请按照下列步骤操作:

  • 以管理员身份打开CMD
  • 跑了以下

命令 netstat -ano|findstr "PID :8081"

得到以下流程:

在此输入图像描述

通过以下方式杀死它:

taskkill /pid 43144 /f

在此输入图像描述

在 MAC 上你可以这样做:

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

用户名@MacBook-Air ~ %kill -9 23722


Aru*_*llu 7

万一检查您是否已经加入这一行多次误倍

app.listen(3000, function() {
  console.log('listening on 3000')
});
Run Code Online (Sandbox Code Playgroud)

上面的代码用于 express,但只需检查您是否尝试在代码中两次使用相同的端口。


Naj*_*thi 7

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


jmr*_*eda 6

对于像我这样的 Visual Studio Noobs

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

Visual Studio中关闭终端后,终端便消失了

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

所以我找到了第一个终端,然后……Voila,我在那儿运行服务器。

实现它的多个终端


小智 5

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

进程选项卡->

选择“ node.exe”进程,然后单击“结束进程”


小智 5

考虑到表格中的所有答案,我想补充一点。

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

当我使用 Ctrl + C 终止节点应用程序时,下次我打开它时,它没有遇到任何问题。

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

  • <key>Ctrl-Z</key> 不会停止该过程。它将它置于后台,以便您可以运行其他命令。这是一个Unix shell。要继续该过程,请在同一个控制台中使用 `fg`。然后,您可以在命令行中键入各种命令后查看该服务器中发生的情况。 (2认同)

Sal*_*zid 5

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

netstat -lntp | grep node
Run Code Online (Sandbox Code Playgroud)

您将获得所有节点进程

tcp6  0      0 :::5744    :::*    LISTEN     3864/node
Run Code Online (Sandbox Code Playgroud)

然后当你获得 PID (3864) 时,只需根据 PID 杀死进程

  kill -HUP PID 
Run Code Online (Sandbox Code Playgroud)


小智 5

如果您是 Windows 用户,只需转到任务管理器并结束 Node js 的所有任务在此输入图像描述