「ポート8080は既に使用されています」「Address already in use」
Web開発やサーバー構築をしていると、こんなエラーメッセージに遭遇することがあります。アプリケーションを起動しようとしたら、必要なポートが既に他のプログラムに使われていて起動できない…そんな経験、ありませんか?
この記事では、Macで使用中のポートを確認する方法を初心者の方にも分かりやすく解説します。ターミナルを使った基本的なコマンドから、実践的なトラブルシューティングまで、幅広く紹介します。
ポートとは?基本を理解しよう

ポートの役割
ポート(Port)とは、コンピューター上で動作するプログラムが通信するための「窓口」です。
IPアドレスが「マンションの住所」だとすると、ポート番号は「部屋番号」のようなものです。
例:192.168.1.100:8080
↑ ↑
IPアドレス ポート番号
(マンション) (部屋番号)
ポート番号の範囲
ポート番号は0〜65535まであり、大きく3つに分類されます。
| 範囲 | 名称 | 用途 | 例 |
|---|---|---|---|
| 0〜1023 | ウェルノウンポート | 標準的なサービスで使用 | 80(HTTP)、443(HTTPS)、22(SSH) |
| 1024〜49151 | 登録済みポート | アプリケーション用 | 3000(開発サーバー)、3306(MySQL)、5432(PostgreSQL) |
| 49152〜65535 | 動的ポート | 一時的な通信で使用 | ブラウザの一時接続など |
ポートの状態
ポートには主に2つの状態があります。
LISTEN状態(待ち受け中):
- プログラムがそのポートで接続を待っている状態
- 例:Webサーバーがポート8080で待機している
ESTABLISHED状態(接続中):
- 実際に通信が確立されている状態
- 例:ブラウザとWebサーバーがデータをやり取りしている
方法1:lsofコマンドで確認(推奨)
lsofは「List Open Files」の略で、Macで最も使いやすいポート確認コマンドです。
全ての使用中ポートを確認
基本コマンド:
sudo lsof -i -P | grep LISTEN
各オプションの意味:
sudo:管理者権限で実行(全ユーザーのプロセスを表示)lsof:開いているファイル(ポートを含む)を一覧表示-i:インターネット関連のファイル(ネットワーク接続)のみ表示-P:ポート番号をそのまま表示(サービス名に変換しない)grep LISTEN:待ち受け状態のポートのみ抽出
実行例:
$ sudo lsof -i -P | grep LISTEN
Password:
node 12345 username 18u IPv4 0x123456 0t0 TCP *:3000 (LISTEN)
mongod 23456 username 10u IPv4 0x234567 0t0 TCP 127.0.0.1:27017 (LISTEN)
mysqld 34567 _mysql 30u IPv6 0x345678 0t0 TCP *:3306 (LISTEN)
出力の見方:
| 項目 | 説明 | 例 |
|---|---|---|
| COMMAND | プロセス名(プログラム名) | node |
| PID | プロセスID | 12345 |
| USER | 実行ユーザー | username |
| NAME | ポート情報 | *:3000 (LISTEN) |
*:3000は「全てのIPアドレスのポート3000で待ち受け」という意味です。
特定のポート番号を確認
コマンド:
sudo lsof -i :ポート番号
例:ポート8080を確認
$ sudo lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 45678 username 18u IPv4 0x456789abcdef 0t0 TCP *:8080 (LISTEN)
このコマンドなら、特定のポートを使っているプロセスだけを素早く確認できます。
プロセス名で検索
特定のプログラムが使っているポートを調べる:
sudo lsof -i -P | grep -i "プログラム名"
例:Dockerが使っているポートを確認
$ sudo lsof -i -P | grep -i docker
com.docke 12345 username 18u IPv6 0x123456 0t0 TCP *:6443 (LISTEN)
TCPとUDPを分けて確認
TCP接続のみ表示:
sudo lsof -iTCP -sTCP:LISTEN -P -n
UDP接続のみ表示:
sudo lsof -iUDP -P -n
オプション説明:
-iTCP:TCPプロトコルのみ-sTCP:LISTEN:TCP接続のLISTEN状態のみ-n:ホスト名の逆引きをしない(高速化)
方法2:netstatコマンドで確認

netstatは古くからある標準的なネットワーク統計ツールです。
基本的な使い方
全ての接続を確認:
netstat -an -ptcp | grep LISTEN
オプション説明:
-a:全てのソケット状態を表示-n:数値でアドレスとポートを表示-ptcp:TCPプロトコルのみgrep LISTEN:待ち受け状態のみ抽出
実行例:
$ netstat -an -ptcp | grep LISTEN
tcp4 0 0 127.0.0.1.3000 *.* LISTEN
tcp4 0 0 *.8080 *.* LISTEN
tcp6 0 0 *.5432 *.* LISTEN
出力の見方:
tcp4 0 0 127.0.0.1.3000 *.* LISTEN
↑ ↑ ↑ ↑ ↑ ↑
プロトコル 受信 送信 ローカルアドレス.ポート リモートアドレス 状態
netstatとlsofの組み合わせ
netstatでポート番号を確認してから、lsofでプロセスを特定する方法です。
手順1:netstatでポート確認
$ netstat -an -ptcp | grep LISTEN
tcp4 0 0 *.8080 *.* LISTEN
手順2:lsofでプロセス特定
$ sudo lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 12345 root 6u IPv4 0x123456 0t0 TCP *:8080 (LISTEN)
IPv4とIPv6を分けて確認
IPv4のみ:
netstat -an -p tcp | grep -E "tcp4.*LISTEN"
IPv6のみ:
netstat -an -p tcp | grep -E "tcp6.*LISTEN"
方法3:nmapコマンドで確認
nmapは強力なネットワークスキャンツールです。デフォルトではインストールされていないので、Homebrewでインストールします。
nmapのインストール
brew install nmap
自分のMacのポートをスキャン
nmap localhost
または
nmap 127.0.0.1
実行例:
$ nmap localhost
Starting Nmap 7.94 ( https://nmap.org )
Nmap scan report for localhost (127.0.0.1)
Host is up (0.00043s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
80/tcp open http
3306/tcp open mysql
8080/tcp open http-proxy
Nmap done: 1 IP address (1 host up) scanned in 0.15 seconds
特定のポート範囲をスキャン
nmap -p 1-10000 localhost
ポート1番から10000番までをスキャンします。
詳細情報付きスキャン
nmap -sV localhost
-sVオプションで、ポートで動作しているサービスのバージョン情報も表示されます。
実践的なトラブルシューティング
シナリオ1:「ポートが既に使用されている」エラー
状況:
$ npm start
Error: listen EADDRINUSE: address already in use :::3000
解決手順:
ステップ1:ポートを使っているプロセスを確認
$ sudo lsof -i :3000
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 23456 username 18u IPv4 0x123456 0t0 TCP *:3000 (LISTEN)
ステップ2:プロセスを終了
# 優しく終了(推奨)
kill 23456
# 強制終了(応答しない場合)
kill -9 23456
ステップ3:確認
$ sudo lsof -i :3000
# 何も表示されなければOK
シナリオ2:Dockerのポート競合
状況:
Dockerコンテナを起動しようとしたら、ポート競合エラーが発生。
確認方法:
# 起動中のDockerコンテナを確認
docker ps
# 出力例:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
abc123def456 nginx "nginx" 1 hour Up 0.0.0.0:8080->80/tcp
対処法1:コンテナを停止
docker stop abc123def456
対処法2:別のポートを使う
# docker-compose.ymlを編集
ports:
- "8081:80" # ホスト側のポートを8081に変更
シナリオ3:システムサービスとの競合
macOSのシステムサービスがポートを使用している場合があります。
よくあるシステムサービス:
| サービス | ポート | 説明 |
|---|---|---|
| AirPlay Receiver | 7000 | AirPlayの受信機能 |
| mDNSResponder | 5353 | Bonjour(サービス検出) |
| cupsd | 631 | プリンター共有 |
AirPlayのポート7000を使いたい場合:
システム環境設定 → 共有 → AirPlayレシーバー → オフ
シナリオ4:複数のプロセスが同じポートを使用
$ sudo lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
nginx 12345 root 6u IPv4 0x123456 0t0 TCP *:8080 (LISTEN)
node 23456 user 18u IPv4 0x234567 0t0 TCP *:8080 (LISTEN)
このような場合、どちらかを終了するか、片方を別のポートで起動する必要があります。
便利なシェル関数を作成

毎回長いコマンドを入力するのは面倒なので、.bash_profileまたは.zshrcに便利な関数を追加しましょう。
.zshrcへの追加(zshの場合)
# ホームディレクトリの.zshrcを編集
nano ~/.zshrc
以下の関数を追加:
# 使用中のポートを確認
ports() {
sudo lsof -iTCP -sTCP:LISTEN -P -n
}
# 特定のポートを確認
port() {
if [ $# -eq 0 ]; then
echo "使い方: port ポート番号"
echo "例: port 8080"
else
sudo lsof -i :$1 -P
fi
}
# パターンで検索
listening() {
if [ $# -eq 0 ]; then
sudo lsof -iTCP -sTCP:LISTEN -n -P
elif [ $# -eq 1 ]; then
sudo lsof -iTCP -sTCP:LISTEN -n -P | grep -i --color $1
else
echo "使い方: listening [パターン]"
fi
}
# プロセスを強制終了
killport() {
if [ $# -eq 0 ]; then
echo "使い方: killport ポート番号"
echo "例: killport 8080"
else
pid=$(sudo lsof -t -i:$1)
if [ -n "$pid" ]; then
echo "ポート $1 を使用しているプロセス (PID: $pid) を終了します..."
kill -9 $pid
echo "完了しました"
else
echo "ポート $1 は使用されていません"
fi
fi
}
変更を反映:
source ~/.zshrc
使い方
# 全ての使用中ポートを確認
ports
# 特定のポート(8080)を確認
port 8080
# "node"を含むプロセスを検索
listening node
# ポート3000を使っているプロセスを終了
killport 3000
GUIツールの紹介
コマンドが苦手な方向けに、GUIアプリもあります。
1. Sloth(無料)
Slothは、lsofのGUIフロントエンドです。
ダウンロード:
- https://github.com/sveinbjornt/Sloth
特徴:
- lsofの結果を見やすく表示
- プロセス、ポート、ファイルを簡単に検索
- プロセスの終了も可能
使い方:
- Slothを起動
- フィルターに「TCP」と入力
- ポート番号で検索
2. アクティビティモニタ(標準搭載)
Macに標準で入っているアクティビティモニタでも、限定的にポート情報を確認できます。
手順:
- アプリケーション → ユーティリティ → アクティビティモニタ
- 「表示」メニュー → 「すべてのプロセス」
- プロセスを右クリック → 「サンプル」
- 開いたウィンドウで「ポート」を検索
ただし、アクティビティモニタは詳細な確認には不向きなので、ターミナルコマンドの方が便利です。
よくある質問
Q1. sudoパスワードを毎回入力するのが面倒
A1. sudo権限を一時的に延長する
sudo -v
このコマンドで、しばらくの間(通常5分)sudoパスワードの入力が不要になります。
A2. lsofコマンドを権限なしで使う(非推奨)
セキュリティリスクがあるため推奨しませんが、どうしてもという場合:
# 自分が起動したプロセスのみ表示
lsof -i -P | grep LISTEN
ただし、他のユーザーやrootが起動したプロセスは表示されません。
Q2. 「Operation not permitted」エラーが出る
最近のmacOS(Mojave以降)では、セキュリティ強化により、lsofやnetstatでもフルディスクアクセス権限が必要な場合があります。
解決方法:
- システム環境設定 → セキュリティとプライバシー
- 「プライバシー」タブ → 「フルディスクアクセス」
- ターミナル.app(またはiTerm2など)を追加
Q3. ポートを解放したのに使えない
確認事項:
- プロセスが完全に終了したか確認
ps aux | grep プロセス名
- TIME_WAIT状態を確認
netstat -an | grep ポート番号
TIME_WAIT状態の場合、TCPの仕様で数分間ポートが解放されません。待つか、別のポートを使いましょう。
- ファイアウォールの確認
macOSのファイアウォールがブロックしている可能性があります。
システム環境設定 → セキュリティとプライバシー → ファイアウォール
Q4. 動的に割り当てられたポートを確認したい
一時的に使用されているポート(ESTABLISHED状態)を確認:
sudo lsof -i -P | grep ESTABLISHED
または
netstat -an | grep ESTABLISHED
Q5. どのポートが安全に使える?
開発環境で使いやすいポート範囲:
- 3000〜3999(Node.js、Reactなどのフレームワーク)
- 8000〜8999(開発用Webサーバー)
- 5000〜5999(Flaskなど)
避けるべきポート:
- 0〜1023(特権が必要)
- システムサービスが使う既知のポート(例:3306、5432、6379)
確認方法:
# 使われていないポートを探す
for port in {8000..8100}; do
if ! sudo lsof -i :$port -P > /dev/null 2>&1; then
echo "ポート $port は空いています"
break
fi
done
応用テクニック
全ての接続をリアルタイム監視
watch -n 1 'sudo lsof -i -P -n'
watchコマンドで1秒ごとに更新表示します。
注意:
macOSには標準でwatchコマンドがないので、Homebrewでインストールが必要です。
brew install watch
ポート使用状況をファイルに保存
sudo lsof -i -P > ~/Desktop/port_status.txt
デスクトップに結果を保存します。トラブルシューティング時の記録として便利です。
プロセスの詳細情報を確認
# PIDからプロセスの詳細を確認
ps -p PID -f
例:
$ sudo lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 user 18u IPv4 0x123456 0t0 TCP *:8080 (LISTEN)
$ ps -p 12345 -f
UID PID PPID C STIME TTY TIME CMD
501 12345 12344 0 9:30AM ttys001 0:00.50 node server.js
これで、どのスクリプトやコマンドで起動されたかがわかります。
特定のユーザーが使っているポートを確認
sudo lsof -u ユーザー名 -i -P
例:
sudo lsof -u username -i -P
まとめ
Macで使用中のポートを確認する方法をまとめます。
基本コマンド3つ:
- lsof(最もおすすめ)
sudo lsof -i -P | grep LISTEN # 全ポート
sudo lsof -i :8080 # 特定ポート
- netstat(標準搭載)
netstat -an -ptcp | grep LISTEN
- nmap(詳細スキャン)
nmap localhost
トラブルシューティングの基本手順:
- ポートを使っているプロセスを特定
sudo lsof -i :ポート番号
- プロセスIDを確認(PID列)
- プロセスを終了
kill PID # 通常終了
kill -9 PID # 強制終了
- 確認
sudo lsof -i :ポート番号
便利なシェル関数:
.zshrcに関数を追加して、簡単にポート確認ports、port 8080、killport 3000など
注意点:
sudoを使うと全ユーザーのプロセスが表示される- システムサービスのプロセスは慎重に扱う
- ポート終了後、TIME_WAIT状態では即座に再利用できない場合がある
活用場面:
- Webサーバーが起動しないとき
- Dockerのポート競合解決
- 開発環境の整理
- セキュリティチェック
ポート確認は開発作業やトラブルシューティングで頻繁に使う技術です。基本的なlsofコマンドさえ覚えておけば、ほとんどの場面で対応できます。
ぜひターミナルを開いて、実際に試してみてください!

