Node.js Ctrl+Zで正常終了の様にプロセスも終了させる方法

ポートをオープンにしてexpress等のサーバーを走らせていると、Ctrl+zでもnodejsのプログラムは終了してしまいます。 しかしプログラムを再起動しようとすると、前回オープンにしたポートが開いているのでプログラムを再起動できません。 過ってCtrl+Zで終了させてしまっても、正常終了させ、再起動ができるようになる簡単に回避する方法です。

Ctrl+zで終了させるプログラム

以下のプログラムを追加するだけです。

//プログラム終了をCtrl+Cでした時、上記のexitを走らせ終了プロセスを実行する。
process.on("SIGINT", function () {
  process.exit(0);
});

Ctrl+zが押されたらSIGSTPと言うメッセージが発行されるので、SIGSTPを検知したらprocess.exit(0)で正常のプログラム終了を実行すると、ポートも解放されるので次回プログラムを再起動できます。

Ctrl+CでもCtrl+Zでも同じ終了プログラム実行

因みに、Ctrl+Cを押した時は、ポートも解放されるので次回プログラムを再起動できるのですが、Ctrl+Cを押した時は、SIGINTが発行されるので、SIGINTを検知したら、process.exit(0)で正常終了する。

更に、process.on(“exit”, funtion( ){ })を記述しておくと、process.exit(0)が実行された時呼び出されるので、Ctrl+CでもCtrl+Zでも同じ終了になる。

//エラーや通常終了の場合、"exit"メッセージを受取、中の終了プログラムを実行する。  
process.on("exit", function() {
  //console.logを書かなくても正常終了できるが、
 //Ctrl+CでもCtrl+Zでも共通の終了プログラムを実行できる。
  console.log("Exitting...");
})

//プログラム終了をCtrl+Zでした時、上記のexitを走らせ終了プロセスを実行する。
process.on("SIGTSTP", function () {
  process.exit(0);
});

//プログラム終了をCtrl+Cでした時、上記のexitを走らせ終了プロセスを実行する。
process.on("SIGINT", function () {
  process.exit(0);
});

本来Ctrl+Zは

本来はCtrl+ZとCtrl-Cと終了は全く別もの。

Ctrl+Zはフォアグランドのプロセスを一時停止でするもの。 なので実行中のnodejsのプログラムは終了するが、バックグランドのサーバーのプロセスは終了せず残ってしまう。 一時停止なので本来は再開ができる。 Ctrl+Cは割り込み(Interrupt)ですね。

プロセスidを探してプロセスを削除して普及

上記の記述を書かず過ってCtrl+Zで終了してしまった時、再起動しようとすると以下のメッセージでエラーとなります。 メッセージ内容は、EADDRINUSEはError address in useの事で、後に書いてある60000番ポートアドレスが使われているという事です。

この時は、ポート60000番を使っているプロセスid(PID)を見つけ終了させます。

  1. netstat -nap |grep 6000でプロセスid(PID)を見つける。 下の場合はプロセスid(PID) 55600がポート番号60000を使っているのが分かります。
  2. そのプロセスid 55600をkillして強制終了させます。
  3. 再度netstat -nap |grep 6000で確認してみると、強制終了されているのが分かります。
  4. これでプログラムを再起動出来ます。

コメント