厄介なポート競合問題先週、新しい Flask API をテストしようとしたところ、macOS が行く手を阻みました。いつもの「Running on http://127.0.0.1:5000」という表示の代わりに、ターミナルには見覚えのある、しかし苛立たしいエラーが表示されたのです。
Error: listen EADDRINUSE: address already in use :::5000
Node.js、Python、Ruby などでツールを開発している方なら、この状況には見覚えがあるでしょう。通常、これはゾンビプロセスがポートを掴んだままになっていることを意味します。しかし、最近の macOS バージョンでは、原因は閉じ忘れたターミナルタブではなく、オペレーティングシステム自体がワークスペースを占拠していることにあります。
犯人は AirPlay レシーバーmacOS Monterey(バージョン 12.0)以降、Apple は「AirPlay レシーバー」をデフォルトで有効にしました。このサービスは、iPhone や iPad からのストリーミングを受け取るためにポート 5000 と 7000 をリッスンします。Flask はデフォルトで 5000 を使用し、多くの Docker ベースのマイクロサービスは 7000 に依存しているため、AirPlay の設定を変更していない開発者にとって、この「機能」は即座に頭痛の種となります。
ステップ 1:プロセスの確認私の言葉を鵜呑みにせず、まずは証拠を確認しましょう。ターミナルを起動し、lsof コマンドを実行して、どのプロセスがポートを占拠しているかを確認します。
sudo lsof -i :5000
もし AirPlay が原因であれば、出力は以下のようになります。
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
ControlCe 482 user 18u IPv4 0x7b... 0t0 TCP *:commplex-main (LISTEN)
ControlCe 482 user 19u IPv6 0x7b... 0t0 TCP *:commplex-main (LISTEN)
COMMAND 列に注目してください。ControlCenter と表示されていれば、それが原因です。macOS では、コントロールセンター(Control Center)が AirPlay のバックエンドを処理しており、自発的にポートを解放することはありません。
ステップ 2:恒久的な解決策プロセスを強制終了するのは一時しのぎに過ぎません。macOS は回復力が高いように設計されており、しつこい NPC のようにサービスを再起動させてしまいます。ポートを永久に解放するには、システム設定でこの機能をオフにする必要があります。
- システム設定(またはシステム環境設定)を開きます。- サイドバーの一般に移動します。- AirPlay と Handoffをクリックします。- AirPlay レシーバーのトグルを探します。- オフに切り替えます。実際に iPhone の画面を Mac にミラーリングするために AirPlay を使用している場合は、「AirPlay を許可」を「現在のユーザ」に変更してみることもできます。しかし、私のテストでは、それでもサービスがポート 5000 をバインドし続けることが多々ありました。開発環境を正常に戻すための唯一の確実な方法は、完全に無効にすることです。
ステップ 3:動作確認設定を変更したら、ターミナルに戻り、再度チェックを実行します。
lsof -i :5000
何も表示されなければ成功です。コマンドの結果が空であれば、ポートは解放されています。これで、EADDRINUSE エラーに邪魔されることなく、開発サーバを起動できます。
代替案:アプリケーションのポートを変更するどうしても AirPlay レシーバーを使いたい場合は、アプリ側のポートを 5001 や 8080 など、別の場所に移動するしかありません。Flask アプリの場合、起動コマンドを次のように調整します。
flask run --port 5001
Node/Express 環境の場合は、エントリポイントを更新します。
const PORT = process.env.PORT || 5001;
app.listen(PORT, () => console.log(`サーバがポート ${PORT} で起動しました`));
ネットワークに関する役立つヒントポートの競合は、開発者にとって避けては通れない問題です。複数の Docker コンテナや複雑なローカルルーティングを扱う際、私はネットワークロジックを整理するためにこの IP サブネット計算機 を使用しています。CIDR ブロックを素早く再確認し、ローカルサービスのプロバイダーが奇妙なルーティングループを引き起こすような重なり方をしていないかを確認するのに便利です。ブラウザ上で完全に動作するため、内部ネットワーク設定のプライバシーも守られます。
今すぐ AirPlay の競合を解消しておくことで、Mac を再起動するたびに幽霊プロセスを追いかけるという繰り返されるストレスから解放されます。

