使用中のポート番号が見つからない? lsof -i で出ない原因と正しい確認・解放方法
アプリ開発中に以下のようなエラーを見たことはありませんか?
Error: listen EADDRINUSE: address already in use :::8000
しかし、いざ調べてみると…
lsof -i :8000
なにも出力されない。
なのに 「ポート8000は使用中」 と言われる。
── この記事では、そんなときの原因と正しい対処方法をまとめます。
🧩 なぜ lsof -i :ポート番号 で出ないのか?
実は lsof は 現在のユーザー権限 でしかプロセスを見られません。
そのため:
- 別のユーザー(例:
rootやdocker)が使っているポート - 権限の違うサービスがバックグラウンドで起動している場合
- 一度終了したが TIME_WAIT 状態で接続が残っている場合
などでは、単純な lsof -i :8000 ではヒットしないことがあります。
🔍 正しい確認方法
そんなときは root権限で全プロセスを調べる のが確実です。
sudo lsof -i -P | grep "LISTEN"
これで現在システム上で 待ち受け状態(LISTEN) のすべてのプロセスが一覧表示されます。
出力例:
node 12345 user 23u IPv6 0x... 0t0 TCP *:8000 (LISTEN)
python3 13456 root 15u IPv4 0x... 0t0 TCP 127.0.0.1:8080 (LISTEN)
👉 左から2番目の数字がプロセスID(PID) です。
🛠️ ポートを解放する
該当プロセスを停止するには、kill コマンドで終了します。
sudo kill <PID>
例:
sudo kill 12345
もし強制終了したい場合は -9 オプションを付けます(最終手段です):
sudo kill -9 12345
🧠 なぜ sudo をつけると見えるのか?
lsof はカーネルの /proc 情報を参照してポート使用状況を取得しますが、
他のユーザーが所有するプロセス情報は通常のユーザー権限では見えません。
sudo をつけることで root 権限になり、
すべてのユーザー・すべてのプロセスのソケット情報を参照できるようになります。
そのため、ようやく「隠れていたポート使用者」が表示されるのです。