4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

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

Posted at

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
Ctrl+Cで終了.gif
SIGINTイベントをリスナー登録することで ターミナルで Ctrl+C 押下もプロセスはまだ生きる。
JSONに SIGINTとタイムスタンプが書き出された
(※ ちなみに webstorm や VSCode の runパネルで実行しているときの ◼停止ボタン 押下時もこれが発火する)

ターミナルが閉じられた場合

SIGHUP
Terminalを閉じた.gif
SIGHUPイベントをリスナー登録することで、ターミナルのウインドウを閉じてもバックグラウンドでプロセスはまだ生きている。
JSONに SIGHUPとタイムスタンプが書き出された

ターミナルが強制終了した場合

同じく SIGHUP
Terminalを強制終了させた.gif
SIGHUPイベントをリスナー登録することで、Mac OS側の「アプリケーションの強制終了」でターミナルを強制終了してもバックグラウンドでプロセスはまだ生きている。
JSONに SIGHUPとタイムスタンプが書き出された

プロセスの終了前

beforeExit

プロセスの終了時

exit

OS自体のクラッシュ

OS自体のクラッシュや、コンピュータの強制シャットダウン (電源ボタン長押しとか停電)などでは Node.jsの プロセスも物理的に即死するので、処理は不可能だと思う。

その他

これらのイベント発火は
Linuxコマンドのシグナル (SIG) に準拠しているみたい。
以下記事を参考にした。

.

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?