※ この記事にはアフィリエイトリンクが含まれます
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」になった。
よくある原因は以前のプロセスが残っていることです。
対処例
ssやlsofでどのプロセスか調べる- プロセスIDを確認して
killで止める - それでもダメなら別ポートで起動する
実際のコマンド例
sudo lsof -i :3000
sudo kill 1234
PORT=3001 npm startケース2:本番サーバで nginx とアプリが競合している
状況:nginx が80番を使っていてアプリも80番で起動しようとする場合があります。
本番ではnginxかアプリのどちらかだけが80番を使うようにします。
対処例
- 必要なら nginx を reverse proxy にしてアプリは別ポートで動かす
- systemctl で nginx を止める(本番では慎重に)
コマンド例
sudo systemctl stop nginx
# または アプリをポート3000で起動して nginx から転送するケース3:Docker がポートを占有している
状況:docker run や docker-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」の問題は解決できます。
わからない場合は、どのコマンドを試したかをメモして相談すると早く解決できます。
コメント