Socketio を個人的に触っていて、
Node.js の終了時に処理を入れようと調べていて、
こちらの方の記事を参考にしていました。
上記記事の情報に加え、
Terminalが強制終了されてしまったときなど、
雑に終了される時に処理をする方法をメモ。
テストコード
各イベントが発火しているのかをテストするために、
発火したイベントとタイムスタンプを JSONにメモるような処理にした。
※console.logを出しても、Terminalが閉じてしまったら読めないため
// サーバー構築
const http = require('http');
const fs = require('fs');
const server = http.createServer(requestListener);
/* ---------------------------------------------------
終了時保存テスト
--------------------------------------------------- */
var saveData = {};
// httpサーバーの起動
server.listen((process.env.PORT || 5000), function() {
console.log((process.env.PORT || 5000) + 'でサーバーが起動しました');
clearJson();
});
// JSONの白紙化
function clearJson() {
var json = JSON.stringify("", null, " ");
fs.writeFileSync("savedata.json", json);
}
// 発火イベントと時刻をJSONに書く
function saveJson(_eventName) {
saveData["event"] = _eventName;
saveData["date"] = new Date();
var json = JSON.stringify(saveData, null, " ");
fs.writeFileSync("savedata.json", json);
console.log("JSONを保存しました");
}
// exit時
process.on("exit", function() {
console.log("exit しました");
});
// Ctrl + C での終了を検知
process.on("SIGINT", function () {
console.log("SIGINT が発火");
saveJson('SIGINT');
process.exit(0); //プロセスを正常終了させる
});
// Terminal が閉じられるのを検知
process.on("SIGHUP", function () {
console.log("SIGHUP が発火");
saveJson('SIGHUP');
process.exit(0); //プロセスを正常終了させる
});
Node.js のプロセスの終了前のイベント各種
process.on("イベント名", function());
Ctrl+C で終了した場合
SIGINT
SIGINTイベントをリスナー登録することで ターミナルで Ctrl+C 押下もプロセスはまだ生きる。
JSONに SIGINTとタイムスタンプが書き出された
(※ ちなみに webstorm や VSCode の runパネルで実行しているときの ◼停止ボタン 押下時もこれが発火する)
ターミナルが閉じられた場合
SIGHUP
SIGHUPイベントをリスナー登録することで、ターミナルのウインドウを閉じてもバックグラウンドでプロセスはまだ生きている。
JSONに SIGHUPとタイムスタンプが書き出された
ターミナルが強制終了した場合
同じく SIGHUP
SIGHUPイベントをリスナー登録することで、Mac OS側の「アプリケーションの強制終了」でターミナルを強制終了してもバックグラウンドでプロセスはまだ生きている。
JSONに SIGHUPとタイムスタンプが書き出された
プロセスの終了前
beforeExit
プロセスの終了時
exit
OS自体のクラッシュ
OS自体のクラッシュや、コンピュータの強制シャットダウン (電源ボタン長押しとか停電)などでは Node.jsの プロセスも物理的に即死するので、処理は不可能だと思う。
その他
これらのイベント発火は
Linuxコマンドのシグナル (SIG) に準拠しているみたい。
以下記事を参考にした。
.