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


441

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

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

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

EADDRINUSE, Address already in use

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

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


39
实际上,不是Ctrl + z您应该使用Ctrl + c哪个通过发送SIGQUIT来正确关闭程序:)
nacho4d

1
你的意思是SIGINT。SIGQUIT是由于`ctrl + \`
Xedecimal

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

1
我遇到了类似的问题,发现此程序包可让您在CTRL + C时干净地退出:npmjs.com/package/exit-hook
Jazzy,

1
1.似乎端口上挂着一个悬空或死进程ID,因此基于节点的服务未启动并抛出错误PORT IN USE(使用中的错误地址)2.我们正在尝试找出如何释放该端口。端口10000,而无需重新启动服务器。
abksharma

Answers:


146

process.on('exit', ..)如果进程崩溃或被杀死,则不会调用。它只能被称为当事件循环结束,而且由于server.close() 某种目的的事件循环(它仍必须等待目前跑这里堆有),这是没有意义的把该退出事件中...

崩溃时,执行process.on('uncaughtException', ..)并杀死时执行process.on('SIGTERM', ..)

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


3
这对挂在process.on('SIGINT',...)上也很有用
farincz 2015年

486

您也可以使用命令行路线:

ps aux | grep node

获取进程ID。

然后:

kill -9 PID

杀死-9时会发送SIGKILL(而不是SIGTERM)。有时,SIGTERM已被节点忽略。


1
ps aux | grep node什么也没显示 还是textareaserver --editor-cmd='gvim -f'失败:3月14日二十一点19分30秒- socket.io准备-接受连接,现在就可以启动服务器:EADDRINUSE,地址已在使用
让乔丹

75
为什么要这么做killall -9 node
马丁·约瑟夫森

1
pidof也很方便
JVE999

25
我使用了很长时间此答案,然后有一天为了方便起见将其组合到一个衬里中。此命令将杀死在给定端口(本例中为8000)上运行的任何进程:lsof -n -i4TCP:8000 | grep LISTEN | tr -s ' ' | cut -f 2 -d ' ' | xargs kill -9
lukejacksonn

1
我有多个节点服务器同时运行,其中一些是Electron应用程序。我只需要使用kill特定的进程ID而不是killall
tuliomir

223

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

sudo lsof -i :3000

这将列出所有PID此端口上侦听,一旦你有PID,你可以用下面的终止它:

kill -9 {PID}

17
ps aux | grep node我的输出不同,此命令清楚地标识PID 。我也不需要sudo
Phil Gibbins

这是最好的答案。我使用带有纱线的React Native在8081端口上对我来说工作正常。
Fernando Barbosa

这对我来说很棒。我可以确定使用端口3000的位置,然后将其关闭。我也不需要sudo
Campalo

很好。我也收到命令后也尝试过killall -9 {COMMAND}killall -9 node
STREET MONEY

哇它为我工作
Anoop PS

159

我在运行win8的笔记本电脑上点击了这个。这工作。

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

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

我是从“命令窗口”运行它的,然后意外关闭了它。节点一直在后台运行(即使会话终止后)。就我而言,一旦我关闭了通过网络套接字连接到它的浏览器选项卡,它最终就会终止。
贝特斯·克鲁格

6
taskkill /F /IM node.exe在Windows上的任何目录下对我来说都是一种魅力:-)感谢您的分享!
马蒂·麦基

2
这是我能够为Windows验证的唯一单行工作解决方案
Code Whisperer

4
在Windows 10上可以使用。我不必以管理员btw身份运行cmd.exe。
Glenn Werner

74

使用以下命令检查在端口3000上运行的进程的PID(即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

这在使用sls脱机插件时对我有用。
Junaid Atique

谢谢你!我刚刚开始学习反应,就像几个小时前一样。:)停止服务器后,我重新运行它,仅遇到此类错误。
格伦

如果我使用丢失,我不会得到任何输出。这是否意味着该部分没有任何处理?
x89


29

的Linux

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

然后跑 sudo kill PID

视窗

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

tasklist /O

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

taskkill /pid PID

1
如果在Windows上?
Trevor

1
就像一个注释...出于某种原因,我不得不在git-bash中的taskkill命令的标志上使用双斜杠: taskkill //IM node.exe 并且我刚刚杀死了node。工作了。
nawlbergs '17

23

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

kill $(lsof -t -i:3000)

20

我一次遇到此错误,并在这里采用了许多方法。

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

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


同样的问题在这里...奇怪的是,它在调试中正常运行,同时得到了运行中的错误npm start
Asqan

16

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

在此处输入图片说明


1
对于Windows用户来说如此简单而
又不

有用。感谢
Najathi

14
ps aux | grep node
kill -9 [PID] (provided by above command)

描述:


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

12

仅供参考,您可以使用一个命令终止该进程 sudo fuser -k 3000/tcp。可以对所有其他通常用于开发的端口(例如8000、8080或9000)执行此操作。



11

首先找出正在使用什么:

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错误


我正在使用nodemon,它将再次重新启动服务。他们有什么办法杀死nodemon吗?
Smit Patel

10

对于像我这样的 Visual Studio Noobs

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

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

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

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

实现它的多个终端


1
哦,是的,我的兄弟。
Jaydeep Shil

8

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

进程选项卡->

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


如果要杀死一个节点端口进程,为什么要杀死整个节点进程。
Jimmy Obonyo Abor '16

8

您可能会遇到甚至杀死线程或进程实际上都不会终止应用程序的情况(在我的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子句中执行的命令。


5

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


4

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

使用npm使用全局选项安装热节点:

npm install -g hotnode


pm2是更好的选择。更强大,更多选择。并且永远以root身份运行时没有问题。
卢卡斯2014年

@Lucas您所说的永远的根本问题是什么?不幸的是,由于某种许可废话,我不得不在工作中的产品上永久使用pm2而不是pm2,这让我很担心!
GPX

4

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

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

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

将端口号更改为错误的端口号即可解决此问题。


1
Ctrl + C是正确的。我使用了与以前相同的端口号,并且它像以前一样工作。
vipulnj

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

4

在Linux上。

将功能添加到~/.bashrc

function killTcpListen () {
  kill -9 $(lsof -sTCP:LISTEN -i:$1 -t)
}

拉取更改: source ~/.bashrc

并使用它: killTcpListen 3000


3

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

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

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


3

Win10,git bash v2.15,节点v8.9.1,npm v5.5.1

我有一个package.json脚本来启动节点: "start": "node index.js"

每当我使用此功能时,无论是否用ctrl + c杀死它,我都会遇到此问题。

如果我只是node index.js从git bash而不是npm run startctrl + c杀掉,那我就永远不会遇到这个错误。

我不确定为什么,但是我认为这可能会对某人有所帮助。


1
我在基本相同的设置中遇到了相同的问题。以我为例,我注意到通过npm运行一个Express应用程序会产生两个进程,但是使用ctrl + c时只有一个关闭。当仅使用节点启动应用程序时,只有一个进程处于打开状态,并且可以正确关闭。
worc

1
这个混帐的Windows问题是一种对整个事情脱落光。似乎在薄荷和cygwin依赖之间可能存在错误。
worc

3

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

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


是的,对,谢谢您的回答
DINA TAKLIT

3

在我的答案中重写@Gerard的评论:

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

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

Namaste🙏


2

节点正在内存中的某个位置运行,并且该端口已锁定。在Windows上,将像大多数Windows问题一样,通过单击CTRL+ ALT+ DEL和/或重新启动来解决此问题。


这个问题回答了很多其他问题。将其关闭,然后再次打开。天才。
datUser '16

1

此问题的原因是:

  1. 像Skype这样的端口可能正在运行任何应用程序。
  2. 节点可能已崩溃,端口可能尚未释放。
  3. 您可能尝试启动多个服务器。为了解决这个问题,可以维护一个布尔值来检查服务器是否已经启动。仅当boolean返回false或undefined时,才应启动该方法。

1

server.close()需要一段时间才能关闭连接,因此我们应该这样进行异步调用:

await server.close();

重要说明:使用await时,我们必须在封装函数中使用async关键字,如下所示:

async () => {
  await server.close();
}

1

在终端/ cmd中使用以下命令更改端口(npm run dev是针对node.js的),您可能还需要其他命令来运行您的应用程序,其中大多数命令在更改端口时都可以工作,更加便捷。此外,您可以使用系统中可用的任何端口号代替3002

PORT=3002 npm run dev

在大多数情况下,一个人突然退出或在不知不觉中运行项目时,按Control + z(使您退出端口)总是选择control + c(不会从端口退出以运行服务器或项目)。

此外,是时候更改代码中的端口号了

server.listen(3002);

0

这意味着您有两个在同一端口上运行的节点服务器,如果其中一个在端口上运行,则假设3000将另一台更改为另一个端口,例如3001,那么一切将正常进行

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.