【Linux】「port already in use」エラーの原因と簡単な直し方を解説

※ この記事にはアフィリエイトリンクが含まれます

Linuxでアプリを動かそうとしたときに「port already in use」とエラーメッセージが表示されて悩んでいませんか?

  • サーバーが起動しない
  • 同じポートを別のアプリが使っている
  • 何を調べればいいかわからない

結論から言うと、問題は「そのポートを別のプロセスが使っている」ことが多いです。

  • どのプログラムが使っているか調べる
  • 不要なら止める(またはプロセスを終了する)
  • または自分のアプリのポートを変える

この記事では、初心者向けにやさしく、実務でよくあるケースと具体的なコマンド例を使って

「port already in use linux」の問題をわかりやすく解説します。


Linux学習を始めると、「コマンドが多すぎて覚えられない…」「何から手をつければいいのかわからない…」と感じる方も多いと思います。

そんな方におすすめなのが『新しいLinuxの教科書 第2版』です。

実際のレビューでも、「初心者でも理解しやすい」「コマンドの丸暗記ではなく、仕組みから学べる」といった声が多く、Linux入門書として高く評価されています。特に、シェル・パイプライン・シェルスクリプト・Gitまで段階的に学べるため、「とりあえずコマンドを打つだけ」で終わらず、実務につながる知識が身につく構成になっています。

これからLinuxを学ぶ方や、インフラエンジニアを目指す方にとって、最初の1冊としてかなりおすすめできる本です。

目次

よくある原因(実務で多いケース)

実務では次のようなケースでよく見かけます。

  • 以前に起動したサーバーがまだ裏で動いている
  • systemdやサービス(例:nginx, apache, mysql)が自動で起動している
  • Dockerコンテナがポートを公開している
  • 開発中のNode.jsやRailsアプリが別プロセスで残っている

まずはどのプロセスが使っているか調べる

一番大事なのは「誰がそのポートを使っているか」を調べることです。
下記のコマンドを実行しましょう。

sudo ss -ltnp | grep :3000

「3000」は調べたいポート番号に置き換えて使用してください。

実行結果(例)

$ sudo ss -ltnp | grep :3000

LISTEN 0      511          *:3000       *:*    users:(("node",pid=12345,fd=23))

上記の例では、node プロセス(PID: 12345)がポート 3000 を使用していることがわかります。

  • node → 使用しているアプリケーション名
  • pid=12345 → プロセスID(停止時に使用)
  • *:3000 → ポート3000で待ち受け中

見つけたらどうするか(安全に対処する手順)

対処は大きく分けて3つあります。
「停止」「終了」「ポート変更」です。

まずは停止できるサービスか確認します。
systemdで管理されているならサービス名を使って止めます。

sudo systemctl stop nginx
sudo systemctl stop apache2

サービスではなく個別プロセスなら、まずは優しく終了させます。
安全な順番でコマンドを使いましょう。

sudo kill 1234    # 優しく終了
sudo kill -9 1234 # 強制終了(最終手段)

kill -9 は強制的にプロセスを止めます。
データが壊れる可能性があるので注意してください。

一括で止めたいとき(fuser)

ポートを使っているプロセスをまとめて止めたい場合は fuser が便利です。
ただし使い方に注意してください。

sudo fuser -k 3000/tcp

このコマンドは3000番ポートを使うプロセスを強制終了します。
実行前に何が動いているか確認することをおすすめします。

自身でポートを変える方法(アプリケーション開発)

サービスを止められない場合や、別の人がそのポートを使っているときは
自分のアプリのポートを変えるのが手っ取り早いです。

例:Node.js の場合は環境変数で変えられることが多いです。

PORT=3001 node app.js

例:Rails(Ruby on Rails)の場合は起動オプションを変えます。

rails server -p 3001

設定ファイルにポート番号が書かれている場合は、そちらを編集して再起動します。
変更後は再度そのポートが空いているか確認してください。

よくある実務ケースと対処例(具体例)

ケース1:開発中のNodeアプリが起動しない

状況:ターミナルで npm start をしたら「port already in use」になった。
よくある原因は以前のプロセスが残っていることです。

対処例

  1. ss lsof でどのプロセスか調べる
  2. プロセスIDを確認して kill で止める
  3. それでもダメなら別ポートで起動する

実際のコマンド例

sudo lsof -i :3000
sudo kill 1234
PORT=3001 npm start

ケース2:本番サーバで nginx とアプリが競合している

状況:nginx が80番を使っていてアプリも80番で起動しようとする場合があります。
本番ではnginxかアプリのどちらかだけが80番を使うようにします。

対処例

  1. 必要なら nginx を reverse proxy にしてアプリは別ポートで動かす
  2. systemctl で nginx を止める(本番では慎重に)

コマンド例

sudo systemctl stop nginx
# または アプリをポート3000で起動して nginx から転送する

ケース3:Docker がポートを占有している

状況:docker rundocker-compose でコンテナがポートを使っている。
特に再起動設定がついていると、勝手に再起動してポートを取り続けます。

対処例

docker ps
docker stop <container_id>
# docker-compose の場合
docker-compose down</container_id>

注意点(安全に作業するために)

・何が動いているかを必ず確認してからプロセスを止めましょう。
systemサービスを止めると別の機能に影響することがあります。

kill -9 は最後の手段です。データの損失や不整合が起きる可能性があります。
・ポート番号は0〜65535の範囲です。通常は1024未満は管理者専用です。

トラブルが続くときの追加チェック

・別のユーザーがそのポートを使っていないか確認する。
・サーバ再起動でクリアできる場合もあります(ただし慎重に)。

systemd のユニットが自動で再起動する設定になっている場合は
ユニット設定を確認して無効化するか編集します。

sudo systemctl status <service-name>
sudo systemctl disable <service-name>  # 起動を止めたいとき</service-name></service-name>

Q&A(初心者がよく聞く質問)

Q: どのコマンドが一番おすすめですか?
A: 新しい環境なら ss、互換性重視なら lsof をおすすめします。

Q: port already in use が出たらまず何をしますか?
A: まずは ss または lsof でプロセス確認。次に安全に停止かポート変更の判断です。

まとめ

ポイントを簡単にまとめます。まずは慌てず確認することが大事です。

  • エラーの意味:そのポートを別のプロセスが使っている
  • 調べ方:ss / lsof / netstat でどのプロセスか確認する
  • 対処法:サービス停止、プロセス終了、または自分のアプリのポートを変更する
  • 実務で多いケース:開発プロセスの残り、nginxやDockerの競合、systemdの自動起動

この記事の手順を順番に試せば、多くの「port already in use linux」の問題は解決できます。
わからない場合は、どのコマンドを試したかをメモして相談すると早く解決できます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

沖縄出身のエンジニアです。IT業界で5年以上の経験があり、主にC#やPHPを使って開発を行ってきました。新しい技術にも興味があり、日々学びながらスキルアップを目指しています。

コメント

コメントする

CAPTCHA


目次