【问题标题】:Why do I repeatedly get EADDRINUSE errors为什么我反复收到 EADDRINUSE 错误
【发布时间】:2020-09-17 07:54:58
【问题描述】:

我可能知道这个问题的答案,但我正在寻找确认,以防我遗漏了什么。

我处于全栈 Node/React 项目的开发模式。我的服务器在端口 5000 上运行。我的客户端在端口 3000 上运行。我将前端路由代理到实际 IO 的节点。所有这些似乎都运行良好。

我在家里的办公室工作,所以当我每天晚上辞职时,我只是离开了我的工作。那天晚上晚些时候,我的机器将我注销。这可能不是最佳做法。

下一个工作日我坐下来工作,我登录,我执行 npm run dev(我正在并发运行)。通常前端出现没问题。但是(即使应用程序正常执行)我的控制台显示 ERRADDRINUSE :::5000。

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

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

我说的对吗?而且,当您确认时,您介意包括“为什么”吗?我还在边走边学。谢谢。

【问题讨论】:

  • run sudo kill -9 `sudo lsof -t -i:5000` 杀死在该端口上运行的服务,在这种情况下是服务器

标签: node.js reactjs localhost port


【解决方案1】:

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

ps -A | grep node

如果出于某种原因需要重新启动该进程,您可能需要先终止该进程,然后再尝试重新启动它。

【讨论】:

  • 我想我不清楚的原因是,如果我在一段时间后在晚上从我的机器上注销,我确信这种情况正在发生,因为我必须重新登录每天早上,PORT 3000(我的客户端)似乎关闭了,但 PORT 5000(我的服务器端)没有?期待我部署这个应用程序的那一天,比如说 heroku,我是否必须刻意做一些事情来确保这不会在生产中发生?
【解决方案2】:

TLDR:

运行ps aux | grep node 将允许您确定正在侦听端口5000 的进程的PID,您可以使用kill -9 PID 终止它。 (其中PID是挂起进程的进程ID)


稍微解释一下:

您的两台服务器在您的系统中分别作为独立的进程运行。如果您运行像top 这样的命令行程序,您将能够获得正在运行的进程的列表,包括进程标识符或PID。

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

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

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

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

有关这方面的更多信息,请参阅有关进程和/或信号的 Linux 手册页。

【讨论】:

  • 我想我不清楚的是为什么,如果我在一段时间后在晚上从我的机器上注销,我确信这种情况正在发生,因为我必须重新登录每天早上,PORT 3000(我的客户端)似乎关闭了,但 PORT 5000(我的服务器端)没有?期待我部署这个应用程序的那一天,比如说 heroku,我是否必须刻意做一些事情来确保这不会在生产中发生?
猜你喜欢
  • 2015-11-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-12
  • 1970-01-01
  • 2020-11-05
  • 2015-01-30
  • 2014-02-10
相关资源
最近更新 更多