MENU

使用中のポートを占有するサービスを即座に特定する実務手順

目次

まず結論:リスニングポートとプロセスを一覧表示する

rootまたはsudoで次のコマンドを実行すると、現在LISTENしているすべてのポートとプロセス名を即座に確認できます。

sudo ss -tlnp

出力例(AlmaLinux 9 / Ubuntu 22.04 環境):

State  Recv-Q Send-Q  Local Address:Port  Peer Address:Port  Process
LISTEN 0      128     0.0.0.0:22          0.0.0.0:*          users:(("sshd",pid=1234,fd=3))
LISTEN 0      511     0.0.0.0:80          0.0.0.0:*          users:(("nginx",pid=5678,fd=6))
LISTEN 0      128     0.0.0.0:443         0.0.0.0:*          users:(("nginx",pid=5678,fd=7))
LISTEN 0      128     127.0.0.1:5432      0.0.0.0:*          users:(("postgres",pid=9012,fd=5))

ssiproute2パッケージに含まれており、AlmaLinux 9・Rocky Linux 9・Ubuntu 22.04以降では標準搭載されています。かつて広く使われたnet-toolsnetstatを含む)は多くのディストリビューションでデフォルトインストール対象外となっているため、新規環境ではssを使うのが現在の実務標準です。

主なオプションの組み合わせは次のとおりです。

オプション意味
-tTCPのみ表示
-uUDPのみ表示
-lLISTENポートのみ表示
-nポート番号を数値で表示(名前解決しない)
-pプロセス情報を表示(root / sudo 必須)

UDPも含めて確認したい場合は -u を加えます。

sudo ss -tlnpu

出力フィールドの読み方

Local Address:Port 欄の表記に注目することで、サービスの公開範囲を把握できます。

表記例意味
0.0.0.0:80全インターフェースで待ち受け(外部からアクセス可)
127.0.0.1:5432ループバックのみ(ローカルホストからしかアクセスできない)
[::]:80全インターフェースのIPv6で待ち受け

PostgreSQLが 127.0.0.1:5432 でリッスンしているケースは、データベースへの外部アクセスを意図的に遮断している設定です。一方、意図せず 0.0.0.0 でリッスンしているサービスが見つかれば、ファイアウォール設定の見直し対象になります。セキュリティ監査や構成変更後の確認にも、このコマンドが役立ちます。

特定のポート番号に絞り込む

「80番ポートを誰が使っているか」だけを知りたい場合は、grepと組み合わせるのが手軽です。

sudo ss -tlnp | grep ':80'

lsof コマンドで同様の絞り込みをする場合は次のとおりです。

sudo lsof -i :80

出力例:

COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   5678   root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)
nginx   5679   www     6u  IPv4  12345      0t0  TCP *:http (LISTEN)

lsof は確立済みの接続(ESTABLISHED)も含めて表示するため、「今まさにこのポートで通信中のプロセス」まで確認できます。一覧の高速確認には ss、接続状態まで含めた詳細把握には lsof、という使い分けが実務では定着しています。

ポート競合が起きたときの実務対応

「サービスが起動しない」「Address already in use」というエラーが出たとき、最初に疑うのがポート競合です。ある運用現場では、Nginxが稼働しているサーバーにApacheを追加インストールしたことで80番ポートの競合が発生し、両サービスが起動不能になったケースが報告されています。

手順1:競合しているポートのプロセスを特定する

sudo ss -tlnp | grep ':80'

手順2:プロセス名からサービスの状態を確認する

systemctl status apache2

手順3:不要なサービスを停止・無効化する

sudo systemctl stop apache2
sudo systemctl disable apache2

stop だけでは再起動後に競合が再発します。不要なサービスは disable までセットで実行するのが実務上の重要なポイントです。

手順4:対象サービスを起動して競合解消を確認する

sudo systemctl start nginx
sudo ss -tlnp | grep ':80'

権限・IPv6・コンテナ環境の注意点

権限について:-p オプションでプロセス情報を表示するにはroot権限またはsudoが必要です。一般ユーザーで実行すると Process 列が空欄になり、どのプロセスが該当ポートを使っているか判断できません。不明な場合は sudo を付けて再実行してください。

IPv6について:IPv6専用ソケットも含めてすべてのリスニングポートを確認したい場合は次のコマンドを使います。

sudo ss -tlnp6

コンテナ環境について:DockerやPodmanで動かしているサービスのポートは、ホスト側の ss に表示されないことがあります。コンテナのポートマッピングは次のコマンドで別途確認します。

docker ps --format "table {{.Names}}\t{{.Ports}}"

コンテナ内のプロセスをホスト側から sslsof で追いかけようとするとポートが見えないケースがあるため、コンテナ環境では上記コマンドを組み合わせて確認する習慣をつけておくと混乱を防げます。

場面別:すぐコピペできるコマンド一覧

# 全リスニングポートとプロセスを確認(最もよく使う)
sudo ss -tlnp

# UDPも含めて確認
sudo ss -tlnpu

# 特定ポートのプロセスを絞り込む(例:443番)
sudo ss -tlnp | grep ':443'

# lsofで特定ポートを詳細確認(接続済みも含む)
sudo lsof -i :443

# 全ネットワーク接続を表示(確立済み接続も含む)
sudo lsof -i

# IPv6も含めたリスニングポートの確認
sudo ss -tlnp6

# コンテナのポートマッピング確認(Docker)
docker ps --format "table {{.Names}}\t{{.Ports}}"

<PR>この記事に関連するおすすめ書籍

[改訂第3版]シェルスクリプト基本リファレンス

移植性の高いシェルスクリプトを書くための逆引きリファレンス。運用スクリプトの信頼性を高めたい方に。

「コマンドは打てる。次は”現場で通用する型”を最短で身につけたい」——そんなあなたへ。

ネットの断片的なTipsをコピペするだけでは、体系的な運用スキルはなかなか積み上がりません。リナックスマスター.JPの無料メルマガ「リナマガ」では、現場で実際に使うLinuxサーバー運用の考え方を、順を追って実務目線でお届けしています。いま登録された方には、安全なサーバー構築の「型」をまとめた『Linuxサーバー構築入門マニュアル(図解60P)』を完全無料でプレゼント中です。

>> 図解60P『Linux入門マニュアル』を無料で受け取る
(メルマガ登録は10秒・いつでも解除OK)

※ 「独学の時間がもったいない」「プロから現場の技術を最短で学びたい」という本気の方には、2日で実務レベルが身につく初心者向けハンズオンセミナーもご用意しています。

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

この記事を書いた人

目次