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