【初心者向け】Macで使用中のポートを確認する方法|開発やトラブル対処に役立つ!

Mac

「ポート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プロセスID12345
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 Receiver7000AirPlayの受信機能
mDNSResponder5353Bonjour(サービス検出)
cupsd631プリンター共有

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の結果を見やすく表示
  • プロセス、ポート、ファイルを簡単に検索
  • プロセスの終了も可能

使い方:

  1. Slothを起動
  2. フィルターに「TCP」と入力
  3. ポート番号で検索

2. アクティビティモニタ(標準搭載)

Macに標準で入っているアクティビティモニタでも、限定的にポート情報を確認できます。

手順:

  1. アプリケーション → ユーティリティ → アクティビティモニタ
  2. 「表示」メニュー → 「すべてのプロセス」
  3. プロセスを右クリック → 「サンプル」
  4. 開いたウィンドウで「ポート」を検索

ただし、アクティビティモニタは詳細な確認には不向きなので、ターミナルコマンドの方が便利です。

よくある質問

Q1. sudoパスワードを毎回入力するのが面倒

A1. sudo権限を一時的に延長する

sudo -v

このコマンドで、しばらくの間(通常5分)sudoパスワードの入力が不要になります。

A2. lsofコマンドを権限なしで使う(非推奨)

セキュリティリスクがあるため推奨しませんが、どうしてもという場合:

# 自分が起動したプロセスのみ表示
lsof -i -P | grep LISTEN

ただし、他のユーザーやrootが起動したプロセスは表示されません。

Q2. 「Operation not permitted」エラーが出る

最近のmacOS(Mojave以降)では、セキュリティ強化により、lsofやnetstatでもフルディスクアクセス権限が必要な場合があります。

解決方法:

  1. システム環境設定 → セキュリティとプライバシー
  2. 「プライバシー」タブ → 「フルディスクアクセス」
  3. ターミナル.app(またはiTerm2など)を追加

Q3. ポートを解放したのに使えない

確認事項:

  1. プロセスが完全に終了したか確認
ps aux | grep プロセス名
  1. TIME_WAIT状態を確認
netstat -an | grep ポート番号

TIME_WAIT状態の場合、TCPの仕様で数分間ポートが解放されません。待つか、別のポートを使いましょう。

  1. ファイアウォールの確認

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つ:

  1. lsof(最もおすすめ)
   sudo lsof -i -P | grep LISTEN  # 全ポート
   sudo lsof -i :8080             # 特定ポート
  1. netstat(標準搭載)
   netstat -an -ptcp | grep LISTEN
  1. nmap(詳細スキャン)
   nmap localhost

トラブルシューティングの基本手順:

  1. ポートを使っているプロセスを特定
   sudo lsof -i :ポート番号
  1. プロセスIDを確認(PID列)
  2. プロセスを終了
   kill PID        # 通常終了
   kill -9 PID     # 強制終了
  1. 確認
   sudo lsof -i :ポート番号

便利なシェル関数:

  • .zshrcに関数を追加して、簡単にポート確認
  • portsport 8080killport 3000など

注意点:

  • sudoを使うと全ユーザーのプロセスが表示される
  • システムサービスのプロセスは慎重に扱う
  • ポート終了後、TIME_WAIT状態では即座に再利用できない場合がある

活用場面:

  • Webサーバーが起動しないとき
  • Dockerのポート競合解決
  • 開発環境の整理
  • セキュリティチェック

ポート確認は開発作業やトラブルシューティングで頻繁に使う技術です。基本的なlsofコマンドさえ覚えておけば、ほとんどの場面で対応できます。

ぜひターミナルを開いて、実際に試してみてください!

タイトルとURLをコピーしました