节点/快递:EADDRINUSE,地址已经在使用 – 杀死服务器
我有一个简单的服务器运行在node.js使用连接:
var server = require('connect').createServer(); //actions... server.listen(3000);
在我的代码中,我有实际的处理程序,但这是基本的想法。 我一直得到的问题是
EADDRINUSE, Address already in use
之前运行我的应用程序之前崩溃或错误时,我收到此错误。 由于我没有打开一个新的terminal实例,我用ctr + z
closures了这个进程。
我相当确定我所要做的就是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
这个问题的原因是:
- 任何一个应用程序都可能在Skype这个端口上运行。
- 节点可能已经崩溃,端口可能没有被释放。
- 您可能试图启动多台服务器。 为了解决这个问题,可以维护一个布尔值来检查服务器是否已经启动。 只有当布尔值返回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}')