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

时间:2010-11-02 06:08:27

标签: node.js

我使用connect:

在node.js中运行了一个简单的服务器
var server = require('connect').createServer();
//actions...
server.listen(3000);

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

EADDRINUSE, Address already in use

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

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

46 个答案:

答案 0 :(得分:406)

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

ps aux | grep node

获取流程ID。

然后:

kill -9 PID

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

答案 1 :(得分:196)

我找到了解决这个问题的最快方法是:

killall node

答案 2 :(得分:119)

如果进程崩溃或被杀死,则不会调用

process.on('exit', ..)。它仅在事件循环结束时被调用,并且由于server.close() 排序结束事件循环(它仍然必须等待当前正在运行的堆栈),放置它是没有意义的在退出事件中......

在崩溃时,执行process.on('uncaughtException', ..)并执行kill process.on('SIGTERM', ..)

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

答案 3 :(得分:112)

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

将cmd.exe作为“管理员”运行:

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

答案 4 :(得分:84)

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

sudo lsof -i :3000

这将列出此端口上的所有 PID 监听,一旦您拥有 PID ,您可以使用以下内容终止它:

kill -9 {PID}

答案 5 :(得分:43)

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

答案 6 :(得分:26)

在我的答案中重写@Gerard 's comment

尝试使用pkill nodejspkill node(如果使用的是类UNIX 操作系统)。

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

答案 7 :(得分:23)

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

  sudo pkill node

答案 8 :(得分:20)

的Linux

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

然后,运行sudo kill PID

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

tasklist /O

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

taskkill /pid PID

答案 9 :(得分:15)

我曾经遇到过这个错误,并采取了很多方法。

我的问题是我在同一个app.js脚本中进行了两次app.listen(3000);次调用。第一次app.listen()成功,第二次投掷错误。

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

答案 10 :(得分:10)

sudo netstat -ltnp | grep -w':3000'

  • tcp6 0 0 ::: 4000 ::: *侦听31157 /节点

杀死31157

答案 11 :(得分:9)

在Linux下试试

pkill nodejs 
//or 
pkill node

答案 12 :(得分:9)

仅供参考,您可以在一个命令API Level 16(Xamarin.Android v4.1 Support)中终止该进程。这可以通过常用于开发的所有其他端口(如8000,8080或9000)完成。

答案 13 :(得分:8)

PowerShell用户:

  

Taskkill / IM node.exe / F

答案 14 :(得分:7)

在Windows用户中:打开task manager文件的end tasknodejs.exe,一切正常。

答案 15 :(得分:7)

Windows 通过 Cmd

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 - 任务管理器手动

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

enter image description here

还有end task

enter image description here

视觉工作室

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

enter image description here

答案 16 :(得分:6)

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

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

答案 17 :(得分:6)

首先了解正在使用什么:

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

答案 18 :(得分:4)

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

enter image description here

答案 19 :(得分:4)

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

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

  

npm install -g hotnode

答案 20 :(得分:3)

在Linux上。

将功能添加到~/.bashrc

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

拉变化:source ~/.bashrc

并使用它:killTcpListen 3000

答案 21 :(得分:3)

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

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

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

答案 22 :(得分:3)

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杀死,我从未遇到此错误。

我不确定为什么,但我认为这可能有助于某人。

答案 23 :(得分:3)

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

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

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

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

答案 24 :(得分:3)

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

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

按照以下步骤操作:

  • 以管理员身份打开 CMD
  • 运行以下
<块引用>

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

得到以下过程:

enter image description here

通过以下方式杀死它:

<块引用>

taskkill /pid 43144 /f

enter image description here

在 MAC 上,您可以这样做:

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

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

答案 25 :(得分:3)

任务管理器(ctrl + alt + del) - &gt;

流程标签 - &gt;

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

答案 26 :(得分:2)

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

netstat -lntp | grep node

您将获得所有节点进程

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

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

  kill -HUP PID 

答案 27 :(得分:2)

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

答案 28 :(得分:2)

对于像我这样的Visual Studio Noobs

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

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

手动创建了一个新的,以为上一个被销毁了。实际上,每次我点击 New Terminal 时,我实际上是 创建 ,在以前的之上强>。

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

multiple terminals withot realizying it

答案 29 :(得分:1)

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

答案 30 :(得分:1)

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

PORT=3002 npm run dev

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

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

server.listen(3002);

答案 31 :(得分:1)

此问题的原因是:

  1. 任何一个应用程序都可能在此端口上运行,如Skype。
  2. 节点可能已崩溃,端口可能尚未被释放。
  3. 您可能尝试过多次启动服务器。要解决这个问题,可以维护一个布尔值来检查服务器是否已经启动。它应该仅在boolean return false或undefined;
  4. 时启动

答案 32 :(得分:0)

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

答案 33 :(得分:0)

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

  • 如果您提供::listen(port)字符串(有意或无意),这不是有效的端口号表示,那么它可以在内部转换为端口号-1,然后是引擎将尝试连接到-1端口,然后产生相同的EADDRINUSE错误,这反过来可能会有点混乱,并导致错误修复搜索错误的方向(嗨,我的xD )。

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

答案 34 :(得分:0)

我还有一个问题。我曾两次申报港口。也不要犯这种错误。

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')
})

答案 35 :(得分:0)

就我而言,这是因为我打开了Eclipse ...

答案 36 :(得分:0)

我面临着同样的问题。我刚刚将端口号从8000更改为6000。 当您有3000时,请尝试5000,4000,7000,8000等。

答案 37 :(得分:0)

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

await server.close();

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

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

答案 38 :(得分:0)

我遇到了同样的问题,我发现这是nodemon问题。首先,我使用此脚本开始过程:

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

应用程序正确启动,但是一旦任何文件更改,nodemon就无法重新启动它。同时,该应用程序仍继续在后台运行。如果我按Ctrl + C,它将退出,但端口3000上没有更多进程,因此通过端口保险丝-k 3000 / tcp杀死它不会执行任何操作。

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

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

因此,我仅将端口值更改为3000,并且它起作用了。

const port = 3000;

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

答案 39 :(得分:0)

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

答案 40 :(得分:0)

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

说明:


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

答案 41 :(得分:0)

仅杀死使用给定PORT的节点进程。正如其他人提到的那样,在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并在空格(非正则表达式模式)中替换“ +”

答案 42 :(得分:-1)

删除项目根目录中的 undefined 文件(该文件是在应用崩溃时创建的)

答案 43 :(得分:-1)

我正在使用调试器,只是没有停止使用 Ctrl + C 运行的进程。因此,当我想开始调试时,出现此错误。

答案 44 :(得分:-1)

对于所有来到这篇文章但尝试过所有人的人都可能使用nodemon或者永远这样做。 例如,如果你跑 PORT=6060 Nodemon 您可能会收到端口6060已在使用中的相同错误。

如果是这种情况,只需运行没有nodemon的项目,如果你真的需要在运行期间定义端口。或者,如果您想坚持使用nodemon,可以在文件中定义端口。

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

答案 45 :(得分:-3)

此命令列出与“节点”相关的任务。并让他们每个人都被终止。

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