1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

使用中のポート番号が見つからない? `lsof -i` で出ない原因と正しい確認・解放方法

Posted at

使用中のポート番号が見つからない? lsof -i で出ない原因と正しい確認・解放方法

アプリ開発中に以下のようなエラーを見たことはありませんか?

Error: listen EADDRINUSE: address already in use :::8000

しかし、いざ調べてみると…

lsof -i :8000

なにも出力されない。
なのに 「ポート8000は使用中」 と言われる。
── この記事では、そんなときの原因と正しい対処方法をまとめます。


🧩 なぜ lsof -i :ポート番号 で出ないのか?

実は lsof現在のユーザー権限 でしかプロセスを見られません。

そのため:

  • 別のユーザー(例:rootdocker)が使っているポート
  • 権限の違うサービスがバックグラウンドで起動している場合
  • 一度終了したが 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 権限になり、
すべてのユーザー・すべてのプロセスのソケット情報を参照できるようになります。
そのため、ようやく「隠れていたポート使用者」が表示されるのです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?