開発者向け

Macでポートが使用中

1つのTCPポートとアドレスで待ち受けられるプロセスは1つだけです。2つ目のサーバは「address already in use」で停止します。

対象:現在のすべてのmacOS。確認日:2026年10月29日

症状

  • 開発用サーバが「EADDRINUSE」または「address already in use」で停止する。
  • 「port is already allocated」のため、Dockerがポートを公開できない。
  • クラッシュやエディタの再起動の前は、そのポートは空いていた。

考えられる原因

  • サーバの古いプロセス。以前に起動したサーバが、バックグラウンドで動き続けています。
  • 別のアプリ。別のアプリが同じポートを使っています。macOS 12以降では、AirPlayレシーバーがポート5000と7000を使います。
  • コンテナ。実行中のコンテナが、同じポートをMac上に公開しています。

確認方法

  1. ポートを待ち受けているプロセスを見つけます。3000は使っているポートに置き換えてください。

    lsof -nP -iTCP:3000 -sTCP:LISTEN

    出力 COMMAND列とPID列にプロセスが表示されます。

  2. 他のユーザのプロセスも見るには、同じコマンドをsudo付きで実行します。

    sudo lsof -nP -iTCP:3000 -sTCP:LISTEN

    管理者パスワードが必要です。

  3. プロセスの詳細を表示します。

    ps -p 12345 -o pid,command
  4. そのポートを公開しているコンテナを探します。

    docker ps

解決方法

  1. 自分のプロセスであれば、そのターミナルウインドウでControl-Cを押して停止します。

  2. そうでなければ、PIDを指定して終了シグナルを送ります。

    kill 12345
  3. それでも停止しない場合は、kill -9を使います。プロセスはデータを保存できません。

  4. macOSのプロセスであれば、停止しないでください。サーバには別のポートを選びます。

  5. ポートが5000か7000の場合は、Macでポート5000や7000が使用中:AirPlayレシーバーを読んでください。

Kilobatを使う場合

  1. 1つのプロセスが開いているソケットを一覧表示します。

    kilobat destinations --pid 12345
  2. PIDを指定してプロセスを終了します。停止しない場合にだけ--forceを付けます。

    kilobat quit 12345

よくある質問

lsofに何も表示されないのに、ポートが使用中なのはなぜですか?

lsofには、調べる権限のあるプロセスしか表示されません。すべてのプロセスを見るには、sudo付きで実行します。

-nと-Pは何をしますか?

lsofがアドレスをホスト名に、ポートをサービス名に変換しないようにします。出力が速くなり、数値で表示されます。

出典

出典は2026年10月29日に確認しました。manページはmacOSに付属のものです。「ターミナル」でman <name>を実行すると開けます。