40.

lsof / netstat / ss で開いているポートを確認する方法(Linux / macOS / Windows)

編集
この記事の要点
  • Linux/macOS の定番: lsof -i :8080(特定ポート)/ lsof -i -P -n | grep LISTEN(全 LISTEN)
  • Linux モダン: ss -tulpn(lsof より高速。netstat は非推奨)
  • netstat -tulpn(旧)/ netstat -ano(Windows)
  • Windows: netstat -ano | findstr :8080 + tasklist | findstr で犯人特定
  • PowerShell モダン: Get-NetTCPConnection -LocalPort 8080
  • ポートを占有しているプロセスを停止: kill -9 (Linux)/ taskkill /F /PID (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.backenddocker-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/macOSWindows
特定ポートの占有者lsof -i :8080netstat -ano | findstr :8080
全 LISTEN 一覧ss -tulpnnetstat -ano | findstr LISTENING
PID からプロセス名ps -p tasklist /FI "PID eq "
プロセス停止kill -9 taskkill /F /PID
モダン代替ssGet-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 から呼ぶ手は使える。

編集
Post Share
子ページ

子ページはありません

同階層のページ
  1. ls ファイル/ディレクトリ一覧表示
  2. sudo ユーザー指定
  3. cron/crontab ジョブの自動実行と登録方法
  4. wget http通信によるファイルダウンロード
  5. rm ファイル/ディレクトリ削除
  6. pwd カレントディレクトリの表示
  7. cd ディレクトリの移動
  8. ./configure
  9. make
  10. make install
  11. unzip ファイルの解凍
  12. mv ファイル/ディレクトリの移動および名称変更
  13. mkdir ディレクトリの作成
  14. touch 空ファイルの新規作成
  15. vi テキストディタの使用
  16. find ファイル/ディレクトリ検索
  17. grep 文字列の検索
  18. tail ファイルの末尾表示
  19. curl HTTP通信によるリクエスト
  20. nslookup ドメインのIP解決
  21. apt update パッケージリストの情報を更新
  22. apt upgrade パッケージの更新
  23. ln リンク/ショートカットの作成と削除
  24. rsync ファイル/ディレクトリの同期
  25. ssh リモートとの暗号化通信
  26. scp sshを利用したファイルのコピー
  27. unzip zip ファイルを解凍する
  28. cp ファイル/ディレクトリのコピー
  29. diffファイルの差分抽出
  30. fdisk ハードディスクに対する操作
  31. lsblk デバイスをツリー状で表示する
  32. kill プロセスを終了させる
  33. zip ファイルやディレクトリをzip形式に圧縮する
  34. host ドメインからIPアドレスを確認
  35. chmod 権限の変更
  36. ip IPアドレスの確認
  37. chown ファイル/ディレクトリ所有者の変更
  38. chgrp ファイル/ディレクトリのグループ情報の変更
  39. nohupと'&' プログラムのバックグラウンド実行(ssh接続時)
  40. lsof 開いているポート番号の確認
  41. tar ファイルの圧縮と解凍
  42. file ファイルの種類を表示
  43. cat ファイルの中身を表示
  44. head ファイルの先頭部分を表示
  45. wc 行数/単語数/文字数を確認
  46. shutdown システムのシャットダウンと再起動
  47. ps プロセスの確認
  48. which コマンドの絶対パスを調べる
  49. yum RedHat系ディストリビューションの管理
  50. mount ファイルシステムのマウント
  51. 特定フォルダ以下の特定拡張子のファイルを再帰的に削除する方法
  52. 特定のフォルダとそのサブフォルダ内にある特定のファイル名のファイルを再帰的に削除