如何解决错误:使用nodejs时监听EADDRINUSE?

2020/09/25 23:21 · javascript ·  · 0评论

如果我使用端口80运行服务器,并且尝试使用xmlHTTPrequest,则会出现此错误:Error: listen EADDRINUSE

在80端口上运行服务器时,如果要发出请求,为什么nodejs会有问题?对于网络浏览器而言,这不是问题:服务器运行时,我可以在Internet上冲浪。

服务器是:

  net.createServer(function (socket) {
    socket.name = socket.remoteAddress + ":" + socket.remotePort;
    console.log('connection request from: ' + socket.remoteAddress);
    socket.destroy();
  }).listen(options.port);

并要求:

var xhr = new XMLHttpRequest();

xhr.onreadystatechange = function() {
    sys.puts("State: " + this.readyState);

    if (this.readyState == 4) {
        sys.puts("Complete.\nBody length: " + this.responseText.length);
        sys.puts("Body:\n" + this.responseText);
    }
};

xhr.open("GET", "http://mywebsite.com");
xhr.send();

EADDRINUSE表示listen()试图将服务器绑定到的端口号已被使用。

因此,在您的情况下,必须已经在端口80上运行了服务器。

如果在此端口上运行其他Web服务器,则必须将node.js放在该服务器后面,并通过它进行代理。

您应该检查listening像这样事件,以查看服务器是否真的在监听:

var http=require('http');

var server=http.createServer(function(req,res){
    res.end('test');
});

server.on('listening',function(){
    console.log('ok, server is running');
});

server.listen(80);

对我真正的帮助是:

killall -9 node

但这会杀死系统进程。

ps ax

您可以检查它是否有效。

killall -9 nodePatrick所建议的上述方法按预期工作,并且可以解决问题,但是您可能希望阅读此答案的编辑部分,以了解为什么kill -9不是最佳方法。

最重要的是,您可能想要针对单个进程,而不是盲目地杀死所有活动进程。

在这种情况下,首先获取在该端口上运行的进程的进程ID(PID)(例如8888):

lsof -i tcp:8888

这将返回类似:

COMMAND   PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node     57385   You   11u  IPv6 0xac745b2749fd2be3      0t0  TCP *:ddi-tcp-1 (LISTEN)

然后就做(ps-实际上不行。请继续阅读下面的内容):

kill -9 57385

您可以在这里阅读更多有关此内容的信息

编辑:我今天正在阅读一个相当相关的主题,偶然发现了一个有趣的话题,为什么我不应该kill -9进行处理

通常,您应kill -9之前使用kill -15以使目标进程有机会在其自身之后进行清理。(进程无法捕获或忽略SIGKILL,但是它们可以并且经常捕获SIGTERM。)如果您没有给该进程完成其工作和清理的机会,它可能会留下损坏的文件(或其他状态)重新启动后将无法理解。

因此,如上所述,您最好使用以下方法终止上述过程:

kill -15 57385

编辑2:正如在此处的注释中多次提到的,此错误是由于未正常退出进程而导致的。这意味着许多人使用CTRL + Z退出节点命令(或其他任何命令)停止正在运行的进程的正确方法是发出CTRL + C命令,该命令执行干净退出。

以正确的方式退出进程将在关闭时释放该端口。这样一来,您就可以重新启动该过程,而不必担心在重新运行之前自行杀死该过程。

抬起头来,Skype有时会在端口80上侦听,因此,如果您尝试从Node.js或任何其他应用程序侦听端口80,则会导致此错误。

您可以通过访问选项并单击“高级”->“连接”->“使用端口80”(取消选中此选项)来在Skype中关闭该行为。

关闭Skype端口80的使用

PS进行更改后,请不要忘记重新启动Skype!

您应该尝试终止正在侦听端口80的进程。

Killall将杀死所有正在运行的节点应用程序。您可能不想这样做。使用此命令,您只能杀死正在已知端口上监听的一个应用程序。

如果使用unix,请尝试以下命令:

sudo fuser -k 80/tcp    

错误原因:您正在尝试使用忙port number

Windows / Mac的两种可能的解决方案

  1. 当前使用的免费端口号
  2. 为您的当前程序选择另一个端口号

1.空闲端口号

视窗

1. netstat -ano | findstr :4200
2. taskkill /PID 5824 /F

在此处输入图片说明

苹果电脑

您可以尝试netstat

netstat -vanp tcp | grep 3000

对于OSX El Capitan和更高版本(或者如果您的netstat不支持-p),请使用lsof

sudo lsof -i tcp:3000

如果这不能解决您的问题,则Mac用户可以参考有关此问题的完整讨论,在Mac上查找(并终止)进程以锁定端口3000


2.更改端口号?

视窗

set PORT=5000

苹果电脑

export PORT=5000

在控制器环境下,您可以使用:

pkill node 在运行脚本之前,应该先完成这项工作。

请记住,此命令将终止所有node进程,如果您有一个只运行一个实例的容器,那么这可能是正确的,因为您拥有可以保证这一点的环境。

在任何其他情况下,我建议使用命令以编程方式查找找到的特定进程ID或名称来杀死它。就像您的进程被称为node-server-1一样,您可以这样做pkill node-server-1

理解以下资源可能会很有用:https :
//www.thegeekstuff.com/2009/12/4-ways-to-kill-a-process-kill-killall-pkill-xkill/

您的应用程序已在该端口8080上运行。使用此代码杀死端口并再次运行您的代码

sudo lsof -t -i tcp:8080 | xargs kill -9

这对我有效(我正在使用mac)。运行此命令

lsof -PiTCP -sTCP:LISTEN

这将显示您的系统正在使用的端口列表。找到PID您的节点正在运行

COMMAND     PID          USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
node      17269 hientrq   16u  IPv6 0xc42959c6fa30c3b9      0t0  TCP *:51524 (LISTEN)
node      17269 hientrq   19u  IPv4 0xc42959c71ae86fc1      0t0  TCP localhost:1337 (LISTEN)

并运行 kill -9 [YOUR_PID]

可能导致此错误的另一件事是同一节点代码中的两个HTTP服务器。我正在将一些Express 2更新为Express 3代码,并且有这个...

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});        

// tons of shit.

http.createServer(app).listen(app.get('port'), function(){            
  console.log('Express server listening on port ' + app.get('port')); 
});                                                                   

并且,它触发了此错误。

lsof -i:3000;
kill -9 $(lsof -t -i:3000);
// 3000 is a your port
// This "lsof -i:3000;" command will show PID 
kill PID 
ex: kill 129393

EADDRINUSE意味着该端口(我们尝试在节点应用程序中监听)已被使用。为了克服这个问题,我们需要确定哪个进程正在该端口上运行。

例如,如果我们尝试在3000端口监听我们的节点应用程序。我们需要检查该端口是否已被任何其他进程使用。

第1步:

$sudo netstat -plunt |grep :3000

上面的命令给出了以下结果。

tcp6       0      0 :::3000                 :::*                    LISTEN      25315/node

第2步:

现在您获得了进程ID(25315),请杀死该进程。

kill -9 25315

第三步:

npm run start

注意:此解决方案适用于linux用户。

须藤杀死$(须藤lsof -t -i:80)

为了杀人

sudo kill -9 $(sudo lsof -t -i:80)

使用以上cmd杀死特定端口,然后运行服务器

尝试这两个命令,它将停止所有节点进程。

killall 9 node
pkill node
npm start 

当您要在其上运行应用程序的端口上运行任何进程时,就会出现此错误。

如何获取在该端口上运行的进程=>命令:sudo netstat -ap | grep:3000

输出:您将获得使用该端口的过程信息

tcp 0 0 IP地址:3000 LISTEN 26869 / node

现在您可以杀死该进程sudo kill -9 26869

在下面的命令中替换您的portNumber

sudo lsof -t -i tcp:portNumber | xargs kill -9

EADDRINUSE表示您的nodejs应用程序的端口已在使用中。

  • 现在,您已经杀死了在该端口上运行的进程/应用程序。
  • 通过以下方式查找应用的进程ID:

lsof -i tcp:3000

  • 现在,您将从中获取进程ID。
  • 运行这个:

杀死-9 processId

有一种使用任务管理器终止该过程的方法:

请注意,此解决方案仅适用于Windows

  1. 进入任务管理器(或使用快捷键Ctrl+ Shift+ Esc

  2. 在“后台进程”上,找到“ Node.js”进程并终止它们(右键单击它们,然后选择“结束任务”)

在此处输入图片说明

  1. 现在您应该可以重新开始了

我在使用http.client之前(在节点中)已经看到此错误,并且我记得,问题与未初始化httpClient或在httpClient创建和/或url请求中设置错误的选项有关。

我也有同样的问题,我只需要关闭终端并打开一个新终端并运行

node server.js

再次。这项功能对我来说有效,有时只需要等待几秒钟,直到它再次起作用。

但这仅适用于开发人员机器,而不适用于服务器控制台。

错误:收听EADDRINUSE表示您要分配/绑定到应用程序服务器的端口已在使用中。您可以为应用程序分配另一个端口。

或者,如果您想为应用程序分配相同的端口。然后终止在所需端口上运行的应用程序。

对于节点应用程序,您可以尝试通过以下方式找到该节点应用程序的进程ID:

ps -aux | grep node

获取进程ID后,执行

kill process_id

在Debian上,我发现要在端口80上运行,您需要以root身份发出命令,即

sudo node app.js

希望对您有所帮助

对于Windows用户,请在PowerShell窗口中执行以下命令以杀死所有节点进程。

Stop-Process -processname node

在我的情况下,Apache HTTP Server在端口80上运行,我通过以root身份发出命令来解决了该问题

sudo killall httpd

更新资料

如果Jenkin已在Mac上安装并运行;

  1. 你可以用 sudo lsof -i tcp:8080
  2. 如果是,并且只想停止詹金斯一次,请运行: sudo launchctl unload /Library/LaunchDaemons/org.jenkins-ci.plist

似乎正在运行另一个Node ng服务进程。在控制台(Linux / Mac)中键入以下命令进行检查:

ps aux|grep node

并退出:

kill -9 <NodeProcessId>

或交替使用

ng serve --port <AnotherFreePortNumber>

在您选择的免费端口上为您的项目提供服务。

在杀死NODE_PORT的同时,它可能会杀死您的chrome进程或正在侦听同一端口的任何东西,这很烦人。

此shell脚本可能会有所帮助-在我的情况下,端口为1337,但您可以随时更改它

# LOGIC

CHROME_PIDS=`pidof chrome`
PORT_PIDS=`lsof -t -i tcp:1337`

for pid in $PORT_PIDS
do

if [[ ${CHROME_PIDS} != *$pid* ]];then

    # NOT FOUND IN CHROME PIDS

    echo "Killing $pid..."
    ps -p "$pid"

    kill -kill "$pid"
    fi

done

sails lift
# OR 'node app' OR whatever that starts your node

exit

在我的情况下,我使用网络托管,但是在本地主机中,我使用的是:

ps -aef | grep 'node' 

为了监视节点进程,控制台将显示带有PID的进程。要杀死该进程,您必须使用以下命令:

kill -9 PID

其中PID是上述命令的进程ID。

两台服务器无法在同一端口上侦听,因此请检查是否有其他服务器在同一端口上侦听,如果在同一端口上运行,则还要检查浏览器同步

对于Windows 10节点为 localhost并在3500之类的端口上运行,而不是80 ...

什么不起作用:

killall    ?  command not found
ps -aux | grep 'node'     ?     ps:  user x unknown 

显示信息但仍然不起作用的内容:

 ps -aef | grep 'node'
 ps ax
 kill -9 61864

什么有效:

Windows上的Git Bash或Powershell

  net -a -o | grep 3500   (whatever port you are looking for) 

请注意,PID(最右边)

无法
killall工作...所以

  1. 打开您的任务管理器
  2. 在“进程”选项卡上,右键单击“名称”或任何列,然后选择以包含PID
  3. 按PID排序,然后右键单击右PID,然后单击结束任务。

现在,在Windows上进行了不太有趣的练习之后,我意识到我可以使用任务管理器并找到Node引擎并结束它。

仅供参考,我使用Visual Studio Code在端口3500上运行Node,并且在VS代码中使用Git Bash shell。我已经用Ctrl + C正常退出了,但是有时候这并不能杀死它。我不想更改端口或重新启动,因此可以正常工作。希望它可以帮助其他人。否则,这是我自己的文档。

对我有用的选项:

跑:

ps -ax | grep node

你会得到类似的东西:

 8078 pts/7    Tl     0:01 node server.js
 8489 pts/10   S+     0:00 grep --color=auto node    
 kill -9 8078
本文地址:http://javascript.askforanswer.com/ruhejiejuecuowushiyongnodejsshijiantingeaddrinuse.html
文章标签: ,  
版权声明:本文为原创文章,版权归 javascript 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!