PM2 - 为什么我在索引输出中收到 EADDRINUSE 地址已在使用的消息.log?



我在由PM2管理的ubuntu LTS 20.4上运行一个NodeJS应用程序。应用程序运行良好,但是当我检查日志时,我看到很多 EADDRINUSE 地址已经在使用的消息。

我使用命令启动了服务器sudo pm2 start index.js

Error: listen EADDRINUSE: address already in use :::8000
at Server.setupListenHandle [as _listen2] (node:net:1432:16)
at listenInCluster (node:net:1480:12)
at Server.listen (node:net:1568:7)
at file:///home/ubuntu/wapi/index.js:105:10
at process.processTicksAndRejections (node:internal/process/task_queues:95:5) {
code: 'EADDRINUSE',
errno: -98,
syscall: 'listen',
address: '::',
port: 8000
}
cleanup

堆栈跟踪指向下面文件的第 105 行。

https://github.com/billbarsch/myzap/blob/myzap2.0/index.js

我不明白的是,当服务已经在运行时,为什么PM2几乎每秒都会尝试启动服务器(因为此消息每秒都会出现在日志中)?

sudo pm2 ls列出了 2 个流程

│ID │ 名称 │ 命名空间 │ 版本 │ 模式 │ PID │ 正常运行时间 │ ↺ │ 状态 │ CPU │ 内存 │ 用户 │ 观看 │

│ 0 │ 索引 │ 默认 │ 1.0.0 │分叉 │ 1673211 │ 103s │ 130 │ 在线 │ 0% │ 111.8MB │ 根 │ 禁用 │

│ 1 │索引 │ 默认 │ 1.0.0 │ 分叉 │ 1673848 │ 2s │ 450...│ 在线 │ 66.7% │ 120.3MB │ 根 │ 禁用 │

真的很感谢一些帮助。

谢谢

看来您已经有另一个运行同一应用程序的 pm2 进程。这就是为什么你看到EADDRINUSE.

您每秒获得相同日志的原因是pm2在出错时往往会重新启动应用程序。

您可以使用以下命令停止所有进程

pm2 stop all

然后尝试重新运行您的进程。

您的错误表明另一个进程已在使用指定的端口。 这可以是服务器上的每个进程,而不仅仅是在PM2下运行的节点进程。

要确定哪个进程已经使用该端口,您可以发出 netstat 命令:

netstat -ano -p -t | grep 8000

这将打印出连接到此端口的所有进程,服务器作为客户端。要识别服务器进程,请查找LISTEN

如果未以特权用户身份登录,请使用 sudo:

sudo netstat -ano -p -t | grep 8000

最新更新