Quantcast
Channel: Node.jsタグが付けられた新着記事 - Qiita
Viewing all articles
Browse latest Browse all 9412

Node.js が無理やり終了した時も処理したいときのメモ

$
0
0
Socketio を個人的に触っていて、 Node.js の終了時に処理を入れようと調べていて、 こちらの方の記事を参考にしていました。 上記記事の情報に加え、 Terminalが強制終了されてしまったときなど、 雑に終了される時に処理をする方法をメモ。 テストコード 各イベントが発火しているのかをテストするために、 発火したイベントとタイムスタンプを JSONにメモるような処理にした。 ※console.logを出しても、Terminalが閉じてしまったら読めないため server.js // サーバー構築 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) に準拠しているみたい。 以下記事を参考にした。 .

Viewing all articles
Browse latest Browse all 9412

Trending Articles