首页 > 解决方案 > Node Express Ubuntu Pm2 | EADDRINUSE

问题描述

我有一个使用 pm2 服务和 nginx 在 Ubuntu 上运行的 node express 应用程序。启动 pm2 服务一切正常,我的应用程序可以访问。一旦我导航到我的应用程序的另一个页面,我的应用程序pm2 list就会显示为status: errored. 当我查看错误日志时,我看到一个循环:

Error: listen EADDRINUSE :::4300

我认为我只需要找到正在使用的服务port 4300并杀死它,但这已经成为一个问题。当我运行时,lsof -w -n -i tcp:4300我确实看到一个运行 id 的服务23350。然后当我运行kill -15 23350时,这显然会终止该进程,但会立即启动一个新服务。我尝试过停止、启动和重新启动 pm2,但没有成功。npm run start当我停止 pm2 时,我什至无法运行Error: listen EADDRINUSE :::4300

为什么 pm2 在导航到我的应用程序的另一个页面时会崩溃?为什么,当 pm2 确实崩溃时,它会抱怨端口 4300 已经在使用中?

我应该注意,当pm2 list报告状态:错误时,我的应用程序仍然可以访问,除非 /contact 页面上的表单被提交。它使用 提交给自己app.post('/contact'...),但在浏览器中,我看到一个空白的白色屏幕,上面写着“无法发布/联系”。

提前感谢您的帮助!

标签: expresspm2

解决方案


我遇到了同样的问题(杀死节点进程但产生了另一个)并最终解决了它。我可能使用了一些错误的 UNIX 术语,如果我这样做了,请纠正我。

我在 AWS EC2 实例上运行 pm2,操作系统是 Ubuntu 20.04。

我的问题是,root 用户的 pm2 进程似乎与 ubuntu(默认)用户的不同。当我是默认用户并运行pm2 status时,我看到了我的一个停止的节点进程。sudo su当我使用and run切换到 root 用户时pm2 status,我发现另一个运行的 pm2 进程在我是默认用户时没有列出!所以我pm2 stop all以root用户身份运行,这解决了我的问题。

脚步:

  1. sudo su # switch to root user
  2. pm2 status # list all processes. For me this listed an extra running process that wasn't listed when I was the default user.
  3. 我只是跑来pm2 stop all停止所有root用户进程。如果需要,您也可以只停止特定的运行过程pm2 stop <name of pm2 process>

希望这可以帮助某人!


推荐阅读