如何在出现全局错误时在脚本内部重新启动 Node.js 服务器?

How do I restart a Node.js server internally in the script on global error?

我一直在浏览,但没有成功。我找到了一些 npm 包,比如 nodemon 和 forever,但是文档没有解释如何在脚本中正确调用重启。

我在另一个问题上找到了 this 代码片段,但我没有使用 Express 或其他框架,因为脚本使用的是拉取服务而不是响应服务。

到目前为止,这是我使用内部 Node.js 依赖项编写的代码,但没有成功。


'use strict'

process.on('uncaughtException', (error) => {
  console.error('Global uncaughtException error caught')
  console.error(error.message)
  console.log('Killing server with restart...')
  process.exit(0)
})

process.on('exit', () => {
  console.log('on exit detected')
  const exec = require('child_process').exec
  var command = 'node app.js'
  exec(command, (error, stdout, stderr) => {
    console.log(`error:  ${error.message}`)
    console.log(`stdout: ${stdout}`)
    console.log(`stderr: ${stderr}`)
  })
})

setTimeout(() => {
  errorTriggerTimeBomb() // Dummy error for testing triggering uncaughtException
}, 3000)

请注意,我运行在 Termux 上连接服务器,这是一个 android 的 Linux 终端应用程序。我知道从桌面 运行 更好,但我总是在 WiFi 或移动数据区,我不喜欢让我的电脑整夜开着。

使用 nodemon 或 forever 之类的典型重启将通过在脚本中调用 process.exit() 来触发。

这将退出当前脚本,然后监控代理会看到它退出并为您重新启动它。它的原理与它自己崩溃时相同,但如果您试图安排它关闭,您只需退出该进程,然后监控代理将重新启动它。

我有一个家庭自动化服务器,它一直在被监控。如果它永远崩溃,将自动重新启动它。我还设置了它,以便每天早上 4 点,它会调用 process.exit(),然后永远自动重启它。我这样做是为了防止长时间积累内存泄漏,半夜 30 秒的停机时间对我的应用程序来说没什么大不了的。