グレースフルスタート/シャットダウン

グレースフルストップ

グレースフルな再起動/再読み込み/停止プロセスを許可するには、アプリケーションが終了する前に、SIGINTシグナルをインターセプトして、必要なもの(データベース接続、処理ジョブなど)をすべてクリアしてください。

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

これで、pm2 reload がグレースフルリロードになります。

強制終了タイムアウトの設定

CLIを使用すると、タイムアウトが3000msに延長されます。

pm2 start app.js --kill-timeout 3000

アプリケーション宣言を介して、kill_timeout属性を使用します。

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

グレースフルスタート

場合によっては、アプリケーションがDB/キャッシュ/ワーカーなどとの接続を確立するまで待つ必要がある場合があります。PM2は、アプリケーションをonlineと見なす前に待機する必要があります。 これを行うには、CLIに--wait-readyを指定するか、プロセスファイルに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はreadyシグナルを3000ms待機します。

CLIを使用すると、タイムアウトが10000msに延長されます。

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

アプリケーション宣言を介して、listen_timeout属性とwait_ready属性を使用します。

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

http.Server.listenを使用したグレースフルスタート

まだhttp.Server.listenメソッドにフックするデフォルトのシステムがあります。 HTTPサーバーが接続を受け入れると、アプリケーションは自動的に準備完了と宣言されます。 --wait-readyグレースフルスタートと同じ変数を使用して、リッスンを待つPM2の時間を増やすことができます。プロセスファイルのlisten_timeoutエントリまたはCLIを介して--listen-timeout=XXXXです。

説明:シグナルの流れ

PM2によってプロセスが停止/再起動されると、特定の順序でいくつかのシステムシグナルがプロセスに送信されます。

最初に、プロセスが停止されることを知るためにキャッチできるシグナルであるSIGINTシグナルがプロセスに送信されます。 アプリケーションが1.6秒以内(カスタマイズ可能)に自分で終了しない場合は、強制的にプロセスを終了させるためにSIGKILLシグナルを受け取ります。

シグナルSIGINTは、環境変数PM2_KILL_SIGNALを設定することにより、他のシグナル(例:SIGTERM)に置き換えることができます。

Windowsグレースフルストップ

シグナルが利用できない場合、プロセスは強制終了されます。 その場合は、CLIを介して--shutdown-with-messageを使用するか、エコシステムファイルで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)
  }
})
このページに貢献する