グレースフルストップ
グレースフルな再起動/再読み込み/停止プロセスを許可するには、アプリケーションが終了する前に、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)
}
})