タイトル: lsof 開いているポート番号の確認
SEOタイトル: lsof / netstat / ss で開いているポートを確認する方法(Linux / macOS / Windows)
| この記事の要点 |
|
典型シナリオ
$ php artisan serve
Failed to listen on 127.0.0.1:8000 (reason: Address already in use)
$ docker compose up
Error starting userland proxy: listen tcp4 0.0.0.0:5432: bind:
address already in use
→ 既に何かが 8000 / 5432 を使っている。何が使っているか特定したい。
Linux / macOS: lsof
# 特定ポートを使っているプロセス
lsof -i :8080
# COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
# node 1234 foo 24u IPv4 ... 0t0 TCP *:8080 (LISTEN)
# 全 LISTEN(待ち受け中)のポート
lsof -i -P -n | grep LISTEN
# -i: ネットワーク, -P: ポート番号で表示, -n: ホスト名解決しない
# TCP のみ
lsof -iTCP -sTCP:LISTEN -P -n
# 特定プロセスが開いているポート
lsof -i -a -p 1234
# 特定ユーザーが開いているポート
lsof -i -u foo
# JSON 風で扱いやすく
lsof -i :8080 -F pcun
# p1234 ← PID
# cnode ← コマンド
# uowner ← ユーザー
Linux: ss(推奨、高速)
現代の Linux では netstat は非推奨で、ss(socket statistics)が標準です:
# LISTEN 中の TCP/UDP を全部
ss -tulpn
# -t: TCP, -u: UDP, -l: LISTEN のみ, -p: プロセス, -n: 数値
# 特定ポート
ss -tulpn | grep :8080
ss -ltn '( sport = :8080 )'
# 接続中のソケット(LISTEN 以外も含む)
ss -tan
# 特定プロセスの全接続
ss -tp | grep nginx
# サマリ
ss -s
Linux/macOS: netstat(旧定番)
# LISTEN ポート全部(要 root)
sudo netstat -tulpn
# Linux:
# Proto Local Address Foreign Address State PID/Program
# tcp 0.0.0.0:80 0.0.0.0:* LISTEN 1234/nginx
# macOS(オプションが違う)
netstat -an -p tcp | grep LISTEN
netstat -anv -p tcp | grep LISTEN # PID 込み (macOS)
# Linux で特定ポート
netstat -tulpn | grep :8080
Windows: netstat
# 特定ポートを使っているプロセス
netstat -ano | findstr :8080
# TCP 0.0.0.0:8080 0.0.0.0:0 LISTENING 1234
# 全 LISTEN
netstat -ano | findstr LISTENING
# PID から実行ファイル名へ
tasklist /FI "PID eq 1234"
# Image Name PID Session...
# node.exe 1234 Console...
# まとめて確認
netstat -anob # 管理者権限必要(プロセス名込み)
Windows: PowerShell(モダン)
# 特定ポートの接続情報
Get-NetTCPConnection -LocalPort 8080
# LocalAddress LocalPort RemoteAddress RemotePort State OwningProcess
# 0.0.0.0 8080 0.0.0.0 0 Listen 1234
# プロセス情報と組み合わせ
Get-NetTCPConnection -LocalPort 8080 |
Select-Object LocalAddress, LocalPort, State, OwningProcess,
@{Name='ProcessName'; Expression={(Get-Process -Id $_.OwningProcess).ProcessName}}
# 全 LISTEN ポート
Get-NetTCPConnection -State Listen |
Sort-Object LocalPort |
Format-Table LocalAddress, LocalPort, OwningProcess
# UDP
Get-NetUDPEndpoint
ポートを掴んでいるプロセスを止める
# === Linux / macOS ===
# 1) PID 特定
lsof -i :8080
# PID = 1234
# 2) 終了
kill 1234 # 通常終了(SIGTERM)
kill -9 1234 # 強制終了(SIGKILL)
# 一発で(fuser)
fuser -k 8080/tcp
# === Windows ===
# 1) PID 特定
netstat -ano | findstr :8080
# PID = 1234
# 2) 終了
taskkill /PID 1234 /F # /F = Force
# PowerShell の場合
Stop-Process -Id 1234 -Force
# プロセス名で
Stop-Process -Name node -Force
Docker 使用時の注意
Docker でポートを公開していると、com.docker.backend や docker-proxy がポートを掴んで見えることがあります:
# Linux で docker-proxy が見える
lsof -i :8080
# docker-pr 9876 root ... TCP *:8080 (LISTEN)
# Docker のどのコンテナが原因か
docker ps --filter "publish=8080"
# CONTAINER ID IMAGE PORTS
# abc123def my-app:latest 0.0.0.0:8080->80/tcp
# コンテナを止める
docker stop abc123def
主要コマンド早見表
| やりたいこと | Linux/macOS | Windows |
|---|---|---|
| 特定ポートの占有者 | lsof -i :8080 | netstat -ano | findstr :8080 |
| 全 LISTEN 一覧 | ss -tulpn | netstat -ano | findstr LISTENING |
| PID からプロセス名 | ps -p <PID> | tasklist /FI "PID eq <PID>" |
| プロセス停止 | kill -9 <PID> | taskkill /F /PID <PID> |
| モダン代替 | ss | Get-NetTCPConnection |
FAQ
Q: lsof が無いと言われる
A: 最小構成の Linux には未導入。apt install lsof / yum install lsof / brew install lsof。代替として ss はほぼ標準。
Q: root じゃないと PID が出ない
A: 仕様。他ユーザーのプロセスは見えない。sudo 付きで実行。
Q: WSL2 でホスト側ポートが見たい
A: WSL2 の Linux からは Windows ホストの netstat は見えない。powershell.exe -Command "Get-NetTCPConnection" を WSL から呼ぶ手は使える。