はじめに
まず、今回は実行環境としてWSL2を使用しています。
いつの日か立ち上げたlocalhost:3001
を再起動したかったのですが、ターミナル上では起動された経歴がありませんでした。
lsof
コマンドを使って確認してもlocalhost:3001
は見当たりません。
なのにブラウザ上ではしっかりとlocalhost:3001
でアプリが立ち上がっています。なぜ?
$ lsof -iTCP -sTCP:LISTEN
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 9607 ayaka_koyama 19u IPv4 92788 0t0 TCP localhost:43817 (LISTEN)
node 18320 ayaka_koyama 19u IPv4 668125 0t0 TCP localhost:46661 (LISTEN)
node 27574 ayaka_koyama 19u IPv4 260919 0t0 TCP localhost:42739 (LISTEN)
解決方法
netstat
コマンドを用いてポートを使用しているプロセスを特定しました。
netstat -tulnp | grep 3001
出力結果のプロセスID (PCID)を確認します。
$ netstat -tulnp | grep 3001
(Not all processes could be identified, non-owned process info
will not be shown, you would have to be root to see it all.)
tcp6 0 0 :::3001 :::* LISTEN [PID]/next-server (
kill
コマンドで該当のプロセスID (PCID)を指定し、サーバーを切断します。
sudo kill -9 [PID]
原因
なぜlsof
では検出できずnetstat
で検出できたのでしょうか?
両者には下記の違いがあります。
lsof
システム上で開いているファイルと、それに関連するプロセスを一覧表示します。
つまり、現在のユーザーがアクセスできるプロセスのみを表示します。
ゾンビ化したプロセスは認識できません。
netstat
ネットワーク接続の状態を表示します。
特にnetstat -tulnp
は現在リスニングしているポートの情報を直接取得します。
そのため、lsof
では検知できない低レベルのネットワーク情報も取得できます。
おわりに
まずなぜこのようなゾンビプロセスが発生してしまったのかは謎ですが、解決できて良かったです。Linuxコマンドを知る機会にもなりました。