express - 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'...)
,但在浏览器中,我看到一个空白的白色屏幕,上面写着“无法发布/联系”。
提前感谢您的帮助!
解决方案
我遇到了同样的问题(杀死节点进程但产生了另一个)并最终解决了它。我可能使用了一些错误的 UNIX 术语,如果我这样做了,请纠正我。
我在 AWS EC2 实例上运行 pm2,操作系统是 Ubuntu 20.04。
我的问题是,root 用户的 pm2 进程似乎与 ubuntu(默认)用户的不同。当我是默认用户并运行pm2 status
时,我看到了我的一个停止的节点进程。sudo su
当我使用and run切换到 root 用户时pm2 status
,我发现另一个运行的 pm2 进程在我是默认用户时没有列出!所以我pm2 stop all
以root用户身份运行,这解决了我的问题。
脚步:
sudo su # switch to root user
pm2 status # list all processes. For me this listed an extra running process that wasn't listed when I was the default user.
- 我只是跑来
pm2 stop all
停止所有root用户进程。如果需要,您也可以只停止特定的运行过程pm2 stop <name of pm2 process>
。
希望这可以帮助某人!
推荐阅读
- nginx - 阻止直接 haproxy ip
- javascript - javascript中的javascript输入问题
- python - 熊猫弃用警告 to_dict()
- java - Spring Boot + Elastic Search + 排除类字段
- ios - 带有 React Native 的 iOS 模拟器上无法识别的字体系列“Saman”
- php - 为什么 Laravel 不从集合中返回项目
- php - 使用 HyperFileSQL 时保护 SQL 查询免受 SQL 注入
- c# - WPF DataGrid 滚动条外观
- c# - 如何在 Xamarin.ios 的另一个视图控制器中调用函数?
- c# - 我可以在 Xamarin.Forms 中直接使用 ListView 的 TemplatedItems 来更新属性吗?