节点/快递:EADDRINUSE,地址已经在使用 – 杀死服务器

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

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

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

 EADDRINUSE, Address already in use 

之前运行我的应用程序之前崩溃或错误时,我收到此错误。 由于我没有打开一个新的terminal实例,我用ctr + zclosures了这个进程。

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

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

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

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

你也可以去命令行路线:

 ps aux | grep node 

获取进程ID。

然后:

 kill -9 PID 

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

我发现解决这个问题的最快方法是:

 killall node 

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

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

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

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

 sudo lsof -i :3000 

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

 kill -9 {PID} 

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

那么, sudo kill PID

编辑 :对于Windows:

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

tasklist /O

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

taskkill /pid PID

我得到这个错误一次,并采取了许多方法在这里。

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

我碰到的另一个有用的命令是帮助我debuggingsudo fuser -k 3000/tcp ,它可以杀死所有可能已经启动的恶意进程(有些进程可能会重启,例如,如果运行forever.js,但是对我有用)。

我find了这个解决scheme,试试吧

  pkill node 

仅供参考,您可以通过一个命令sudo fuser -k 3000/tcp进程。 这可以通过8000,8080或9000等常用于开发的其他端口来完成。

您可以使用热节点来防止服务器崩溃/运行时错误。 只要节点程序[source] / process [running node program]发生变化,热节点就会自动重新启动nodejs应用程序。

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

npm install -g hotnode

PowerShell用户:

Taskkill / IM node.exe / F

节点在内存中的某个地方运行,并将该端口locking。 在Windows上,像大多数Windows问题一样,这个问题将会发生,通过按CTRL + ALT + DEL和/或重新引导来解决。

任务pipe理器(ctrl + alt + del) – >

进程选项卡 – >

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

对于表格中所有答案的适当尊重,我想补充一点。

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

当我使用Ctrl + C来终止一个节点的应用程序时,下一次我打开它,它没有一个顺利。

将端口号更改为错误以外的其他端口号可以解决问题。

在Linux上。

将函数添加到~/.bashrc

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

拉改变: source ~/.bashrc

并使用它: killTcpListen 3000

这个问题的原因是:

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

您可能会使用多个服务器。 您可以closures它们并使用一台服务器。在Linux中,您可以使用killall node命令。

以防万一你是否错误地多次添加了这一行

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

上面的代码是为了expression,但只是检查你是否试图在你的代码中使用相同的端口两次。

要小心,像我一样,你没有另外一个DOS框(或类似的)运行,你忘记了x)

它确实产生了上面显示的确切的错误!

这意味着你有两个节点服务器在同一个端口上运行,如果有一个在端口上运行,比方说3000换另一个端口可以说3001,一切都会运行

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

  • 如果你提供::listen(port)和string(有意或者无意),这不是一个有效的端口号表示,那么它可以被内部转换为端口号-1 ,ant然后引擎将尝试连接到那个-1端口,然后产生相同的EADDRINUSE错误,这反过来可能会有点混淆,并将错误的方向进行错误修复search( 嗨,我xD )。

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

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

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