用語集/問題が起きたとき

リッスン中のポート

別名: 開いているポート、ポート3000を使っているもの

結論

リッスン中のポートとは、ポート3000のWebサーバのように、プロセスが外からの接続を待っているネットワークポートです。あるポートとアドレスでリッスンできるプロセスは一度に1つだけなので、“address already in use”のようなエラーが出ることがあります。

開発サーバ、データベース、一部のアプリはリッスン中のポートを開きます。サーバを起動しようとしてポートが使用中で失敗する場合は、ほかのプロセス(多くは同じサーバの以前のコピー)がまだそこでリッスンしています。

アクティビティモニタでもプロセスの開いているファイルとポートを表示できますが、どのプロセスがポートを使っているかを最も早く調べられるのは、ターミナルのlsofコマンドです。

ポートを使っているものを調べる方法

ターミナルでlsof -nP -iTCP:3000 -sTCP:LISTENを実行します。3000は自分のポート番号に置き換えてください。出力にはコマンド名とそのPIDが表示されます。

リッスン中のTCPポートをすべて一覧表示するには、lsof -nP -iTCP -sTCP:LISTENを実行します。前にsudoを付けると、ほかのユーザが所有するプロセスも含まれます。

ポートを解放する方法

自分で起動したサーバなら、まずは通常の方法で止めましょう。たとえば、そのサーバを実行しているターミナルでControl+Cを押します。そうでなければ、lsofで調べたPIDを使ってkill <PID>を実行します。kill -9 <PID>は、それでも終了しない場合だけ使います。

止める前にプロセス名を確認しましょう。macOSのサービスが使っているポートもあります。たとえば最近のmacOSでは、AirPlayレシーバーがポート5000と7000でリッスンしています。

アクティビティモニタでポートを確認する方法

プロセスをダブルクリックし、“開いているファイルとポート”タブを開きます。そのプロセスが開いているファイルとネットワーク接続が一覧表示されます。

lsofの出力の読み方

各行が1つの開いているソケットです。サーバは通常、同じPIDでIPv4とIPv6の2行が表示されます。

  • COMMANDはプロセス名で、デフォルトでは9文字で切れます。完全な名前を見るには+c 0を付けます: lsof +c 0 -nP -iTCP -sTCP:LISTEN。
  • PIDは、killやpsに渡すプロセスIDです。
  • USERは、そのプロセスを実行しているアカウントです。rootが所有するプロセスは、たいていmacOSの一部か、インストールされたサービスです。
  • NAMEにはアドレスとポートが表示されます。*:3000は、サーバがすべてのネットワークインターフェイスで接続を受け付けるという意味です。127.0.0.1:3000や[::1]:3000なら、接続できるのはこのMacだけです。

開発サーバがどのプロジェクトのものかを確認する方法

プロセス名はnode、python、rubyだけのことが多く、どのプロジェクトが動いているのかわかりません。それを確かめるコマンドが2つあります。

  1. lsof -nP -iTCP:3000 -sTCP:LISTENでPIDを調べます。
  2. ps -o pid,ppid,command -p <PID>を実行すると、起動に使われたコマンド全体がわかります。
  3. lsof -a -p <PID> -d cwdを実行すると、実行されているフォルダがわかります。たいていはプロジェクトフォルダです。
  4. PPIDがシェルを指しているなら、そのサーバはターミナルのウインドウから起動されています。そのウインドウがまだ開いていれば、そこでControl+Cを押して止めます。

何も動いていないように見えるのにポートが使用中になる理由

ポートがAirPlayレシーバーのものなら、サーバを別のポートで動かすか、“システム設定 > 一般”の“AirDropおよび連係”セクションでAirPlayレシーバーをオフにします。

  • 以前のセッションのサーバが、忘れていたターミナルのタブやウインドウでまだ動いている。
  • サーバがバックグラウンドで、またはエディタやほかのツールによって起動され、見えるウインドウがない。
  • サーバはクラッシュしたが、それが起動した子プロセスがまだポートを使っている。
  • macOSのサービスが同じポートを使っている。たとえば、ポート5000と7000のAirPlayレシーバー。

アクティビティモニタの“ポート”の列はネットワークポートではない

アクティビティモニタの“CPU”タブには、オプションで“ポート”の列があります。これが数えているのはMachポートで、macOSがプロセス間のメッセージのやり取りに使う仕組みです。topでポートとして表示されるものと同じ数値です。ネットワークポートの一覧ではありません。ネットワークポートには、lsofか、プロセスの情報ウインドウにある“開いているファイルとポート”タブを使います。

よくある質問

Macでポート3000を使っているものを調べるには?

ターミナルでlsof -nP -iTCP:3000 -sTCP:LISTENを実行します。そのポートでリッスンしているプロセスの名前とPIDが表示されます。

Macで特定のポートを使っているプロセスをkillするには?

lsofでPIDを調べてから、kill <PID>を実行します。終了しなければ、kill -9 <PID>でただちに終わらせます。

Macで開いているポートをすべて一覧表示するには?

lsof -nP -iTCP -sTCP:LISTENを実行すると、リッスン中のTCPポートが一覧表示されます。sudoを付けると、ほかのユーザのプロセスも含まれます。

“address already in use”とはどういう意味?

そのポートとアドレスで、ほかのプロセスがすでにリッスンしているという意味です。lsof -nP -iTCP:<port> -sTCP:LISTENで見つけて止めるか、別のポートを選びます。

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

そのプロセスは、別のユーザかrootのものかもしれません。同じコマンドの前にsudoを付けて実行すると、すべてのプロセスが含まれます。

ポート5000や7000を使っているものはkillしても安全?

名前を確認せずにkillしてはいけません。最近のmacOSでは、これらのポートはAirPlayレシーバーが使っていることが多く、それなら代わりに“システム設定”でオフにできます。

関連項目

詳しい手順: Dockerのメモリ使用量が多すぎる。

アクティビティモニタより優れたものをお探しなら、Mac向けアクティビティモニタの代替アプリのおすすめをご覧ください。用語集のすべての用語も見られます。