为什么我反复收到EADDRINUSE错误信息?

问题描述 投票:0回答:2

我可能知道这个问题的答案,但我想确认一下,以防我错过了什么。

我在一个全栈NodeReact项目上处于开发模式。我的服务器在5000端口上运行。我的客户端在3000端口上运行。我将我的前端路由代理到node进行实际的IO。所有这些似乎都运行得很好。

我在家里的办公室工作,所以当我每天晚上下班时,我都会离开我的工作岗位。当天晚上的某个时候,我的机器就会把我注销。这可能不是一个最好的做法。

下一个工作日,我坐下来工作,我登录,我执行npm run dev(我是同时运行的)。通常情况下,前端会出现No Problem。然而(即使应用程序正常执行)我的控制台显示ERRADDRINUSE :::5000。

看起来一切都很正常,但我想可能有什么东西在等着我。而且,这也表明它并不是完全良性的。

我的想法是这样的。我确实每天晚上都会自动注销,但显然这不一定会关闭端口(至少5000端口不会)。我想,我可能应该每天晚上进行实际的关闭或重启。

我说的对吗?还有,当您确认时,您是否介意包括 "为什么"?我还在不断地学习。谢谢。

node.js reactjs localhost port
2个回答
0
投票

当端口5000上已经有一个进程在监听时,ERRADDRINUSE就会出现。在再次启动节点进程之前,请检查该进程是否正在运行。

ps -A | grep node

如果该进程由于某种原因需要重新启动,你可能要先杀死该进程,然后再尝试重新启动它。


0
投票

TLDR:

运行 ps aux | grep node 将允许您确定正在监听端口5000的进程的PID,您可以用 kill -9 PID...(其中PID为挂起进程的进程id)


多解释一下。

你的两台服务器都是独立运行的 流程 在你的系统中。如果你运行一个命令行程序,如 top你将可以看到正在运行的进程列表,包括进程标识符或PID。

当你的系统状态发生变化时(注销、关闭、失去网络连接)。操作系统会发出一个 信号 有时称为软件中断)。然后,进程负责在接收到信号后决定如何进行。有单独的代码称为信号处理程序)。大多数现代网络框架已经内置了信号处理程序来响应常见的信号。

通常,当SIGTERM信号发出时,一个进程被终止,或者当SIGKILL信号发出时,一个进程被强制停止。

但是,时不时有进程挂起的情况也是很常见的。(我以前在nodejs服务器上看到过这种情况)。要停止它们,最简单的办法是自己手动向进程发出SIGTERM(优雅地停止进程)或SIGKILL信号(强制停止进程)。

进程的 kill -9 PID 命令可以用来向进程发出SIGKILL信号。

更多信息请参见Linux手册中的进程和信号。

© www.soinside.com 2019 - 2024. All rights reserved.