【问题标题】:PM2 is catching errors before they reach 'uncaught Exception' in Node.jsPM2 在它们到达 Node.js 中的 \'uncaught Exception\' 之前捕获错误
【发布时间】:2022-08-21 17:05:16
【问题描述】:

大家好,我在 Node.js 中使用 Discord.js 运行一个不和谐机器人。我的目标是通过 pm2 在 Linux Ubuntu 服务器上运行它。

我想建立一个清理过程退出程序未捕获的异常.

但是,当我抛出一个示例错误时通过 pm2 运行它未捕获的异常未达到,pm2 只是记录错误并继续运行脚本。当直接使用 Node.js 运行它时,没有 pm2 一切都按预期工作。

这是我的代码:

process.on(\'uncaughtException\', async (err, origin) => {
    console.log(\'test\')
    // await Cleanup();
    process.exit(1);
});

这里是使用 pm2 运行的控制台输出:

Error: Test error
at Object.execute (script xxxx)
at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
at async xxx

如您所见, pm2 有点防止测试错误达到未捕获的异常. Pm2 没有重新启动脚本,也没有记录 \'test\'

我还尝试通过以下方式捕获错误信号情报或者SIGTERM但这些都不起作用。

pm2 中是否有禁用此行为的选项?

谢谢你的帮助!

    标签: javascript node.js pm2


    【解决方案1】:

    当应用程序崩溃或终止时,PM2 会自动重新启动应用程序。

    我记得,你不能禁用这个:https://pm2.keymetrics.io/docs/usage/restart-strategies/

    更新

    通常process.exit(0); 会重启pm2 进程。

    您还有一种解决方法可以从您的应用程序中强制重启。 您需要使用 --watch 参数启动您的应用程序:

    pm2 start app.js --watch
    

    因此,您只需要在应用程序目录内的目录中写入/修改/删除一个临时文件。当 pm2 检测到新文件时,它将重新启动您的应用程序。这不是一个干净的解决方案,但这项工作。

    【讨论】:

    • 谢谢你的回答。不幸的是,pm2 并没有重新启动脚本,它一直在运行。您的回答是我的目标,我希望 pm2 重新启动脚本而不是禁用自动重新启动。
    • @Huetti 好的,我不明白您需要重新启动应用程序。我已经更新了我的答案。
    • 谢谢,这看起来很有希望,我明天试试。
    • 这是您可以预测的错误的解决方案,但是当我不确定它们是否永远不会引发意外错误时,我无法涵盖我在 try catch 中的所有语句。有时,例如当 db 连接抛出错误或 sql 语句时,我想要重新启动。
    • 我不确定在每个错误上重新启动是一个好的模式。如果您重新启动 sql 错误语句或其他任何而不是处理它(日志记录、电子邮件警报或其他所有内容),您将停止执行循环中的所有其他用户请求。
    【解决方案2】:

    引发错误的函数是async。 这使我找到了unhandledRejection 事件的文档。

    此外未捕获的异常我添加了未处理的拒绝

    process.on('uncaughtException', async (err, origin) => {
      await Cleanup(...); //my own cleanup
      process.exit(0);
    });
    
    process.on('unhandledRejection', async (reason, promise) => {
      await Cleanup(...); //my own cleanup
      process.exit(0);
    });
    

    现在 pm2 在cleanup 之后重新启动,只要抛出未捕获的错误/异常。

    【讨论】:

      猜你喜欢
      • 2015-10-14
      • 1970-01-01
      • 2021-07-08
      • 2021-06-04
      • 2015-09-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-05-05
      相关资源
      最近更新 更多