发生 express 错误时,pm2 不会重新启动 worker

Posted

技术标签:

【中文标题】发生 express 错误时,pm2 不会重新启动 worker【英文标题】:pm2 does not restart worker when express error occur 【发布时间】:2015-11-11 04:01:32 【问题描述】:

我正在使用 pm2 来管理我的 nodejs express 应用程序中的进程(以集群模式运行)。

我们有两种错误处理程序

FIRST: 'uncaughtException' 将被处理

process.on('uncaughtException', function(err));

实际上,我并没有声明这样的处理程序,因为在这种情况下让 pm2 检测到死掉的工人,所以自动重启死掉的工人。

SECOND:表示错误处理程序,我的意思是错误将被转发到表示错误处理程序,而不是 uncaughtException 处理程序,错误处理程序如下所示

app.use(function(err, req, res, next) )

我也没有出于与 uncaughtException 相同的目的声明此错误处理程序。 但是这种情况下 pm2 不会重启节点。

对这个问题有任何想法吗? 非常感谢

【问题讨论】:

真的需要重启你的应用吗?如果我没记错的话,该应用程序仍在运行并且可以响应新请求。由于捕获到异常,您应该在快速错误处理程序中响应一些漂亮的页面,说明存在问题,而不是让客户端的浏览器超时。 是的,当错误被快速错误处理程序捕获时,服务器不会崩溃。但是,异常意味着您的代码中存在一些问题,并且服务器可能会进入不稳定状态,您无法知道它将来会对请求做出什么反应。我认为在这种情况下,我们应该重启这个节点。 然后您可以在记录发生的情况后在错误处理程序中尝试 process.exit(0)。 pm2 应该重新启动它。 是的,我刚刚这样做了,现在一切正常。 【参考方案1】:

当使用 express 错误处理程序甚至“uncaughtException”事件捕获错误时,进程仍在运行,因此 pm2 不会重新启动它。 如果您希望 pm2 在每次异常后重新启动,我建议您这样做:

    process.on('uncaughtException', function(e) 
      console.log('An error has occured. error is: %s and stack trace is: %s', e, e.stack);
      console.log("Process will restart now.");
      process.exit(1);
    )

快速错误处理程序也是如此。当我们执行 process.exit 方法时,进程会终止,pm2 会重新启动它。

【讨论】:

以上是关于发生 express 错误时,pm2 不会重新启动 worker的主要内容,如果未能解决你的问题,请参考以下文章

解决node+express在linux上关闭服务器服务就停止的问题(非PM2)

pm2 重启策略(restart strategies)

nodejs pm2使用

有没有办法使用cron重新启动pm2进程但是只有它还没有运行?

node.js express的安装与部署,以及pm2下的运行启动。

使用 Express 处理 Prisma 错误