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

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

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

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

EADDRINUSE, Address already in use

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

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

1242796 次浏览

Linux

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

然后,运行sudo kill PID

windows

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

tasklist /O

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

taskkill /pid PID

process.on('exit', ..)不会在进程崩溃或被杀死时被调用。它只在事件循环结束时被调用,而且由于server.close()有点结束了事件循环(它仍然需要等待当前正在运行的堆栈),所以把它放在退出事件中是没有意义的…

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

话虽如此,SIGTERM(默认终止信号)让应用程序清理,而SIGKALL(立即终止)不会让应用程序做任何事情。

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

ps aux | grep node

以获取进程ID。

然后:

kill -9 PID

杀死时执行-9会发送一个SIGKill(而不是SIGTERM)。 SIGTERM有时会被节点忽略。

节点正在内存中的某个地方运行并锁定了该端口。在Windows上,这个问题会发生,就像大多数Windows问题一样,通过点击CTRL+ALT+DEL和/或重新启动来解决。

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

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

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

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

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

npm安装节点

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

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

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

出现这些问题的原因是:

  1. 任何一个应用程序都可以在此端口上运行,例如Skype。
  2. 节点可能已崩溃,端口可能未被释放。
  3. 您可能尝试启动多个服务器。为了解决这个问题,可以维护一个布尔值来检查服务器是否已启动。只有当布尔值返回false或未定义时才应该启动;

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

进程选项卡->

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

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

此命令列出与“节点”相关的任务,并终止每个任务。

kill -9  $( ps -ae | grep 'node' | awk '{print $1}')

这意味着您有两个节点服务器在同一个端口上运行,如果一个在端口上运行,比如3000,将另一个更改为另一个端口,比如3001,一切都会正常工作

我找到了这个解决方案,试试看 允许使用sudo

  sudo pkill node

恕我直言,我想补充一点。

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

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

将端口号更改为错误的端口号以外的东西解决了这个问题。

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

sudo lsof -i :3000

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

kill -9 {PID}

PowerShell用户:

任务杀死 /IMnode.exe /F

以防万一,如果您错误地添加了这一行多个

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

上面的代码是快速的,但请检查您是否尝试在代码中两次使用相同的端口。

我想知道,为什么没有人提到这种可能性:

  • 如果您为::listen(port)提供字符串(有意或无意),这不是有效的端口号表示,则可以在内部将其转换为端口号-1,然后引擎将尝试连接到该-1端口,然后产生相同的EADDRINUSE错误,这反过来可能会稍微令人困惑,并将您转向错误修复搜索(嗨,我XD)的错误方向。

所以,在开始检查使用您的端口的进程之前,调试您的代码并检查您传递给函数的确切内容

Linux。

~/.bashrc添加函数:

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

拉取更改:source ~/.bashrc

使用它:killTcpListen 3000

使用以下命令检查在端口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

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

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

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

如果我只是从git bash运行node index.js而不是npm run start并用ctrl+c杀死,我从来没有得到这个错误。

我不知道为什么,但我想这可能会帮助别人。

对于所有来到这篇文章并尝试过的人来说,可能会使用no恶魔或永远来做这件事。 例如,如果你跑 PORT=6060 Nodemon 您可能会收到相同的错误,即端口6060已在使用中。

如果是这种情况,如果您真的需要在运行过程中定义端口,只需在没有no的情况下运行您的项目。或者,如果您想坚持使用no的,您可以在文件本身中定义端口。

对我来说,我现在这样做PORT=6060 node app.js

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

kill $(lsof -t -i:3000)

首先找出正在使用的内容:

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

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

在此处输入图片描述

对于像我这样的Visual Studio Noobs

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

Visual Studio中的终端关闭之后,终端只是消失

我创建了一个新的EYZ0,以为以前的EYZ1被摧毁了。实际上,每次我点击新终端时,我实际上是创建一个新的在之前的基础上

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

多个终端而不实现它

在我的情况下,这是因为我打开了Eclipse…

server.close()需要一段时间才能关闭连接,因此我们应该将其作为异步调用:

await server.close();

重要提示: 使用等待时,我们必须在封装函数中使用async关键字:

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

只杀死使用给定端口的节点进程。正如其他人提到的,在bash中,您可以使用kill $(lsof -t -i:PORT)

这是一个Windows解决方案(有办法!): netstat -bona | findstr ".0:PORT +0.0.0.0:0 +LISTENING" | for /f "tokens=5" %t in ('more') do taskkill /PID:%t /F。为此,您需要一个提升的终端(在VSCode中,您需要使用提升打开自身,因为集成终端无法提升)。

PS:如果findstr不可用,您可以简单地使用find并将空格替换为“+”(非正则表达式模式)

您可能会遇到即使杀死线程或进程也不会真正终止应用程序的情况(我在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-cat子句中执行的命令。

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

问题描述


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

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

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

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

在终端/cmd中使用以下命令更改端口(npm run dev适用于node.js),您可能还有其他命令来运行您的应用程序,其中大多数命令在更改端口时都可以工作,更容易更快。此外,您可以使用系统中免费的任何端口号,而不是3002

PORT=3002 npm run dev

大多数情况下,当一个人在退出时运行项目时,一个人突然或不知不觉地按下Control+z,让你退出端口,总是选择Control+c,它不会退出端口来运行服务器或项目。

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

server.listen(3002);

我也遇到了同样的问题,我发现这是诺恶魔的问题。首先,我使用这个脚本开始我的过程:

{"dev": "nodemon -r dotenv/config app.js"}

应用程序正确启动,但是一旦任何文件更改,nodem就无法重新启动它。在此期间,应用程序仍然继续在后台运行。如果我执行Ctrl+C,它会退出,但是端口3000上没有更多进程,所以通过端口fuser-k 3000/tcp杀死它没有任何作用。

而且,我在app.js文件中使用. env端口。

const port = process.env.PORT || 3000;

所以,我只将端口值更改为3000,它起作用了。

const port = 3000;

我必须找到另一种方法来加载. env文件,但这为我解决了问题。希望有帮助。

在我的答案中重写@杰拉德的评论

如果在类unix OS上尝试pkill nodejspkill node

这将杀死在任何端口上运行节点服务器的进程。 对我有用

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


bash$ kill 31157

删除项目根目录中的未定义文件(在应用程序崩溃时创建)

我也遇到了同样的问题。我刚刚将端口号从8000更改为6000。 因为你有3000,你尝试5000,4000,7000,8000等。

我正在使用调试器,只是没有停止使用Ctrl+C运行的进程。所以当我想开始调试时,我遇到了这个错误。

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

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

遵循这些步骤:

  • 打开CMD作为管理员
  • 查了一下

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

得到了以下过程:

在此处输入图片描述

通过以下方式杀死它:

/pid43144 /f

在此处输入图片描述

在MAC上,你可以这样做:

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

username@MacBook-Air~%杀死-9 23722

Windows by Cmd

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

在此处输入图片描述


2/2。运行windows命令:任务工具

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

taskkill /f /im node.exe

/f-强制结束

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

node.exe-可执行文件

在此处输入图片描述

Windows-任务管理器的Mannualy

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

在此处输入图片描述

end task

在此处输入图片描述

视觉工作室

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

在此处输入图片描述

我还遇到了另一个问题。我已经两次申报了港口。不要犯那个错误。

app.listen(port, function () {
console.log('Example app listening on port')
})


app.listen(3000, function() {
console.log("Server started on port 3000");
});

而是这样做:

const port = 3000;


app.listen(port, function () {
console.log('Example app listening on port')
})

简单退出服务器并将服务器端口3000更改为31000并正常工作。

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

netstat -lntp | grep node

您将获得所有节点进程

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

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

  kill -HUP PID

试着更改端口号。这对我有用。

对于macosmonterey(12.0):

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

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


对于macOS Ventura(13.0)及以上用户:

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

我通常使用

npx kill-port 3000

在我的Mac上。

killall node

这发生在我身上,因为我在我的ubuntu中打开了多个Visual Studio实例而没有注意到它,并且其中一个已经在运行xdebug。

在我的情况下,这个问题是由NodeJS环境引起的

两种解决方案:

  1. 打开任务管理器和杀死所有nodejs进程(名称:Node.jsJavaScript运行时

  2. 尝试更改服务器的端口3000到其他当前未使用的端口(例如:3111)。

现代Windows(PowerShell)

当前版本的Windows默认使用Powershell而不是cmd。在这里你会运行:

Get-NetTCPConnection | where Localport -eq 3000 | select Localport,OwningProcess

找出该应用程序是什么。

真的只是为了所有的OS…

npx kill-port 3000

虽然您的问题如上所述,但您需要捕获节点可以退出的不同方式,例如

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


// insert other handlers.

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