优雅的停止

为了允许优雅的重启/重新加载/停止进程,请确保在让应用程序退出之前拦截SIGINT信号并清除所需的一切(如数据库连接、处理作业……)。

https://pm2.keymetrics.io/docs/usage/signals-clean-restart/

process.on('SIGINT', function() {
   db.stop(function(err) {
     process.exit(err ? 1 : 0)
   })
})

现在pm2 reload会变成gracefulReload

配置终止超时

通过 CLI,这会将超时延长至 3000 毫秒:

pm2 start app.js --kill-timeout 3000

通过应用程序声明使用kill_timeout属性:

module.exports = {
  apps : [{
    name: 'app',
    script: './app.js',
    kill_timeout : 3000
  }]
}

优雅的开始

有时您可能需要等待您的应用程序与您的数据库/缓存/工作者/任何东西建立连接。PM2 在将您的应用程序视为 online. 为此,您需要--wait-ready向 CLI 提供或wait_ready: true在流程文件中提供。这将使 PM2 监听该事件。在您的应用程序中,您需要添加process.send('ready');何时您希望您的应用程序被视为准备就绪。

var http = require('http')

var app = http.createServer(function(req, res) {
  res.writeHead(200)
  res.end('hey')
})

var listener = app.listen(0, function() {
  console.log('Listening on port ' + listener.address().port)
  // Here we send the ready signal to PM2
  process.send('ready')
})

然后启动应用程序:

pm2 start app.js --wait-ready

配置就绪超时

默认情况下,PM2 等待 3000ms 的ready信号。

通过 CLI,这会将超时延长至 10000 毫秒:

pm2 start app.js --wait-ready --listen-timeout 10000

通过应用程序声明使用listen_timeoutandwait_ready属性:

module.exports = {
  apps : [{
    name: 'app',
    script: './app.js',
    wait_ready: true,
    listen_timeout: 10000
  }]
}

优雅开始使用 http.Server.listen

仍然有挂钩http.Server.listen方法的默认系统。当您的 http 服务器接受连接时,它会自动将您的应用程序声明为准备就绪。您可以使用与优雅启动相同的变量来增加 PM2 等待时间--wait-ready:listen_timeout进程文件中的条目或--listen-timeout=XXXX通过 CLI。

说明:信号流
当一个进程被 PM2 停止/重启时,一些系统信号会按给定的顺序发送到您的进程。

首先,一个SIGINT信号被发送到您的进程,您可以捕获该信号以了解您的进程将被停止。如果您的应用程序在 1.6 秒(可自定义)之前没有自行退出,它将收到SIGKILL信号以强制进程退出。

通过设置环境变量PM2_KILL_SIGNAL,可以在任何其他信号(例如SIGTERM )上替换信号SIGINT。

Windows优雅停止

当信号不可用时,您的进程将被终止。在这种情况下,您必须--shutdown-with-message通过 CLI 或shutdown_with_message在生态系统文件中使用并监听shutdown事件。

通过 CLI:

pm2 start app.js --shutdown-with-message

通过应用程序声明使用shutdown_with_message属性:

module.exports = {
  apps : [{
    name: 'app',
    script: './app.js',
    shutdown_with_message: true
  }]
}

监听shutdown事件

process.on('message', function(msg) {
  if (msg == 'shutdown') {
    console.log('Closing all connections...')
    setTimeout(function() {
      console.log('Finished closing connections')
      process.exit(0)
    }, 1500)
  }
})
作者:Jeebiz  创建时间:2023-02-26 00:52
最后编辑:Jeebiz  更新时间:2023-02-26 22:38