「Address already in use」は、プログラムが使おうとしたポート番号を、すでに別のプロセスが使っているときに出るエラーです。解決方法は、そのポートを使っているプロセスを特定して停止するか、自分のプログラムを別のポートで起動するかのどちらかです。

多くの場合、原因は「前に起動したサーバーが、終了せずに残っている」ことです。この記事では、Windows・Mac・Linuxそれぞれでポートを使っているプロセスを特定して止めるコマンド、よくある原因のパターン、そしてプロセスを止めても解決しない特殊なケースまでを解説します。

エラーメッセージの例

言語やツールによって表示は違いますが、どれも同じ意味です。

環境 エラーメッセージの例
Node.js Error: listen EADDRINUSE: address already in use :::3000
Python OSError: [Errno 98] Address already in use(Macでは Errno 48)
Java java.net.BindException: Address already in use
Spring Boot Web server failed to start. Port 8080 was already in use.
Ruby on Rails Address already in use - bind(2) for "127.0.0.1" port 3000
Go listen tcp :8080: bind: address already in use
Docker Bind for 0.0.0.0:5432 failed: port is already allocated
Windows 通常、各ソケット アドレスに対して1つの使用だけが許可されています

解決の流れ

  1. ポートを使っているプロセスを特定する
  2. それが止めてよいものか確認する
  3. 停止する(または自分のプログラムのポートを変える)

いきなり強制終了せず、何が使っているのかを確認してから止めるのがポイントです。データベースや別のアプリケーションなど、必要なプロセスが使っている場合もあります。

Mac・Linuxでの確認と停止

ポートを使っているプロセスを調べる

lsof -i :3000
COMMAND   PID  USER   FD   TYPE  DEVICE SIZE/OFF NODE NAME
node    12345  you    23u  IPv6  0x...       0t0  TCP *:3000 (LISTEN)

COMMAND(プログラム名)とPID(プロセス番号)を確認します。待ち受けているプロセスだけを表示するなら、lsof -i :3000 -sTCP:LISTEN とします。他のユーザーのプロセスは、sudo を付けないと表示されないことがあります。

Linuxでは、ss コマンドも使えます。

ss -ltnp | grep :3000
# LISTEN 0 511 *:3000 *:* users:(("node",pid=12345,fd=23))

プロセスを停止する

kill 12345        # 通常の終了(まずはこちら)
kill -9 12345     # 通常の終了で止まらない場合の強制終了

kill は、プロセスに「終了してください」と伝える方法で、プログラムは後片付け(ファイルの保存や接続の切断)をしてから終了できます。kill -9 は後片付けをさせずに強制終了するため、データベースなどに使うとデータが壊れる恐れがあります。まず kill を試し、止まらない場合だけ -9 を使います。

ポートの確認と停止を1行で行うこともできます(停止するプロセスを確認せずに実行する点に注意)。

kill $(lsof -t -i :3000)

Windowsでの確認と停止

コマンドプロンプト

netstat -ano | findstr :3000
  TCP    0.0.0.0:3000    0.0.0.0:0    LISTENING    12345

一番右の数字がPIDです。PIDからプログラム名を確認し、停止します。

tasklist /FI "PID eq 12345"
taskkill /PID 12345          # 通常の終了
taskkill /PID 12345 /F       # 強制終了

PowerShell

Get-NetTCPConnection -LocalPort 3000 | Select-Object LocalAddress, State, OwningProcess
Get-Process -Id 12345
Stop-Process -Id 12345

タスクマネージャーの「詳細」タブでも、PIDを手がかりにプロセスを探して終了できます。

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Address already in useの解決方法【Windows・Mac・Linux】」

よくある原因と対処

原因 よくある状況 対処
前に起動したサーバーが残っている ターミナルを閉じた、IDEが異常終了した 上記の手順でプロセスを停止する
Ctrl+Zで一時停止したままになっている Ctrl+Cのつもりで、Ctrl+Zを押した jobs で確認し、fg で戻してCtrl+C、または kill %1
同じサーバーを2回起動した 別のターミナルやタブで、すでに起動していた どちらか一方を停止する
Dockerのコンテナが使っている 以前起動したコンテナが動き続けている docker ps で確認し、docker stop で停止する
ローカルにインストールしたサービスが使っている MySQL(3306)やPostgreSQL(5432)が常駐している サービスを止めるか、Docker側のポートを変える
MacのAirPlayレシーバーが使っている Flaskなどを5000番で起動しようとした 下記参照

Ctrl+Zは「終了」ではない

Ctrl+Cはプログラムの終了、Ctrl+Zは一時停止です。Ctrl+Zで止めたサーバーは、裏で停止したまま残っており、ポートも使い続けます。

jobs          # 一時停止中のジョブを確認  → [1]+  Stopped  npm run dev
fg            # 前面に戻す(その後 Ctrl+C で終了)
kill %1       # ジョブ番号を指定して終了

Dockerのコンテナがポートを使っている

Bind for 0.0.0.0:5432 failed: port is already allocated

このエラーは、別のコンテナ、またはパソコン上のプログラムが、同じポートを使っていることを意味します。

docker ps                          # 動いているコンテナとポートを確認
docker stop <コンテナ名またはID>
docker compose down                # compose で起動したものをまとめて停止

パソコンに直接インストールしたデータベースと、Dockerのデータベースを両方使いたい場合は、Docker側の公開ポートを変えます。

# docker-compose.yml
services:
  db:
    image: postgres:16
    ports:
      - "5433:5432"   # パソコン側は5433、コンテナ内は5432

MacでAirPlayが5000番・7000番を使っている

macOS Monterey以降では、AirPlayレシーバーがポート5000と7000を使います。Flaskの既定のポートが5000のため、Macで「Address already in use」が出ることがあります。lsof -i :5000 で ControlCenter と表示されたら、これが原因です。

  • Flaskのポートを変える:flask run --port 5001
  • または「システム設定」→「一般」→「AirDropとHandoff」で「AirPlayレシーバー」をオフにする

プロセスを止めても解決しない場合

Windowsで、どのプロセスも使っていないのに起動できない

Windowsでは、Hyper-V・WSL2・Dockerなどが、一定の範囲のポートを予約していることがあります。この場合、netstatには何も表示されないのに、次のようなエラーで起動できません。

アクセス許可で禁じられた方法でソケット アクセスしようとしました。

予約されている範囲は、次のコマンドで確認できます。

netsh interface ipv4 show excludedportrange protocol=tcp

使いたいポートがこの範囲に含まれていたら、範囲外のポートを使うのが最も簡単な対処です。

1024番未満のポートで「Permission denied」が出る

80番や443番のような1024番未満のポートは、Linux・Macでは管理者の権限が必要です。この場合のエラーは「Address already in use」ではなく「Permission denied」(EACCES)です。開発中は3000番や8080番など1024番以上を使い、本番ではリバースプロキシ(nginxなど)で80・443番を受けるのが一般的です。

サーバーを再起動した直後だけ失敗する

サーバーを停止した直後は、接続の後始末の状態(TIME_WAIT)が一時的に残り、自作のサーバープログラムでは、同じポートにすぐ再接続できないことがあります。多くのWebフレームワークは対策済みですが、ソケットを直接扱うプログラムでは、SO_REUSEADDR オプションを設定すると解消できます。

ポートを変えて起動する

使っているプロセスを止められない場合は、自分のプログラムのポートを変えます。

ツール ポートの変え方
Node.js(Express など) PORT=3001 npm start(コード側で process.env.PORT を読む場合)
Vite npm run dev -- --port 5174(使用中なら自動で次の番号を使う)
Next.js next dev -p 3001
Flask flask run --port 5001
Django python manage.py runserver 8001
Spring Boot server.port=8081(application.properties)
Rails rails server -p 3001

ポート番号をコードに直接書かず、環境変数(PORT など)で指定できるようにしておくと、環境ごとに変えやすくなります。

開発でよく使うポート番号

ポート 主な用途
3000 Node.js(Express・Next.js)、Rails
5000 Flask(MacではAirPlayと競合)
5173 Vite
8000 Django、各種開発サーバー
8080 Spring Boot、Tomcat、各種開発サーバー
3306 MySQL
5432 PostgreSQL
6379 Redis
27017 MongoDB

新しいプロジェクトを始めるときに、すでに常駐しているサービスのポートと重ならない番号を選んでおくと、競合を減らせます。

よくある質問

Q. ポートを使っているプロセスを止めても大丈夫ですか? A. 自分が起動した開発サーバーなら、止めて問題ありません。見覚えのないプロセスの場合は、プログラム名を確認し、必要なサービス(データベースなど)でないかを確かめてから止めてください。

Q. kill -9 を使ってはいけないのですか? A. 使ってはいけないわけではありませんが、プログラムが後片付けできないまま終了します。まず通常の kill を試し、止まらない場合に使うのが安全です。

Q. パソコンを再起動すれば直りますか? A. 残っていたプロセスが終了するため、多くの場合は直ります。ただし、原因がわからないままだと再発するので、上記の手順でどのプロセスが使っていたかを確認しておくのがおすすめです。

Q. VS Codeのターミナルを閉じたのに、サーバーが止まっていません。 A. ターミナルの閉じ方や設定によっては、起動したプロセスが残ることがあります。サーバーは、ターミナルを閉じる前にCtrl+Cで停止する習慣をつけると、このエラーを防げます。

まとめ

  • 「Address already in use」は、そのポートを別のプロセスが使っているという意味
  • Mac・Linuxは lsof -i :ポート、Windowsは netstat -ano | findstr :ポート でPIDを確認する
  • 止めるときは、まず通常の終了(kill・taskkill)、止まらなければ強制終了
  • よくある原因は、残ったサーバー、Ctrl+Zでの一時停止、Dockerのコンテナ、常駐サービス
  • MacのFlaskはAirPlayの5000番、Windowsは予約済みのポート範囲にも注意
  • ポートは環境変数で変えられるようにしておく

本記事の内容は、ご自由にお使いください。
ご利用の際は、出典として本ページへのリンクを記載いただけますようお願いします。

(記載例)出典:株式会社RJC「Address already in useの解決方法【Windows・Mac・Linux】」

株式会社RJCでは、エラーメッセージを落ち着いて読み解く力を、エンジニアの大切な基礎体力だと考えています。こうした知識を仲間と共有しながら、一緒に成長を楽しんでいます。

株式会社RJC ― SI事業・SES事業・AI駆動開発。未経験からエンジニアに育てるのが得意な会社です。

WE ARE HIRING

RJCで一緒に開発しながら、
成長を楽しみませんか?

RJCは、Web・モバイル・AIを活用した開発プロジェクトで、テックリードやPM・PMOも活躍するシステム開発会社です。会社を知る、待遇を確かめる、話を聞いてみる。気になるところ見てみてください!

  • 127日年間休日
  • 12時間平均残業時間
  • 毎日ガチャ遊びココロも大切にする福利厚生。アマギフなどの賞品ラインナップ!

ほかにも、チケットレストラン、書籍読み放題、2年ごとの慰労報奨(休暇 or 金一封)、11期連続の黒字決算。

ABOUT RJC RJCがどんな会社か知る 考え方、研修、働き方、福利厚生、社員の前職まで。RJCのことが丸わかり! RJC丸わかりページへ JOB DESCRIPTION 仕事内容・待遇を見てみる 仕事内容、給与・待遇、選考の流れ。経験者も未経験も!応募前に知りたいこと、まとめました! 募集要項を見る ENTRY エントリーする エントリーは1〜2分・履歴書不要です。まずは話を聞いてみたい、という方でも歓迎です! エントリーフォームへ

RJCで一緒に開発しながら、 成長を楽しみませんか?