テクノロジー · 実用ガイド

Node の EADDRINUSE?プロセスを止める前にバインド、リスナー、監督元を証明する

完全なアドレスとポートを保存し、同じ名前空間でリスナーを特定し、所有者経由で停止して一度だけ再起動を検証します。

Node の EADDRINUSE?プロセスを止める前にバインド、リスナー、監督元を証明する
オリジナルイラスト:完全な bind tuple を保存し、listener と所有者を証明します。 Watch at Ease

このガイドは EADDRINUSE を「Node を終了する命令」ではなく、bind の所有権監査として扱います。エラーオブジェクトを保存し、アドレス、IP ファミリ、名前空間で衝突範囲を絞ります。

次に listener PID から terminal、supervisor、service、container という実際の管理元を追跡します。socket の解放を確認した後だけ一度再起動し、観測可能な結果で完了を判定します。

1. 完全なバインド失敗を保存

再起動前に code、syscall、address、port または socket path、実際の起動コマンド、cwd、Node 版、監督プロセスを保存します。EADDRINUSE はローカルアドレスが占有中という意味で、所有者名ではありません。

:::3000 を単なる「3000 番が使用中」と縮めません。ワイルドカード、IP ファミリ、ネットワーク名前空間も衝突条件です。

2. ポートより先にアドレスとファミリを読む

host を省略すると Node は通常 ::、IPv6 がなければ 0.0.0.0 に bind します。多くの環境で IPv6 wildcard は IPv4 も覆うため、同じポートの IPv4 bind と衝突します。

127.0.0.1、0.0.0.0、::1、:: は同じではありません。設計上必要でない限り、bind を広げたり IPv6 を無効にして隠しません。

3. 同じ名前空間でリスナーを確認

Linux では ss -ltnp または対象ポートのフィルタを使います。-l は listen、-n は数値、-p はプロセス情報です。必要な最小権限で確認します。

macOS は lsof、Windows は Get-NetTCPConnection と Get-Process を使えます。コンテナでは host 公開ポートと失敗した container namespace の両方を確認します。

4. PID から本当の所有者へ追跡

PID は監督下の子かもしれません。コマンドラインと親を記録し、nodemon、PM2、systemd、Docker Compose、Kubernetes、IDE の所有を確認します。

nodemon の事例は save restart で :: と 5000 が衝突することを示します。全 Node を止めず、監督と shutdown のライフサイクルを直します。

5. 所有者経由で停止し解放を検証

terminal job、PM2 アプリ、systemd unit、container など所有者の stop を使います。強制終了は対象と範囲を証明した後の最後の手段です。

同じ socket 検査を再実行し、listener が消え再生成されないことを確認します。killall node や広い sudo コマンドは避けます。

6. 設計上必要な場合だけポートを変更

意図した二つの service が別 endpoint を必要とする場合だけ port を変更します。闇雲な port 移動は古い supervisor を残します。

port 0 は listening 後の実値を client に渡します。固定 port の proxy、firewall、service discovery、health check は契約全体を更新します。

7. 一度だけ再起動しリスナーを証明

まず reload と複数 worker を切り一つだけ起動します。PID/container、local address、port、family と health route を確認してから監督を戻します。

再発時は owner、parent、namespace、timeline を比較します。clean socket 後の再発は duplicate launch や restart race を示し、cache や Node 再インストールの理由ではありません。

完全なアドレスとポートを保存し、同じ名前空間でリスナーを特定し、所有者経由で停止して一度だけ再起動を検証します。
オリジナルイラスト:監督元から停止し、socket 解放後に一度だけ再起動します。 Watch at Ease