サーバでどのプロセスがどのポートをリッスンしているか、まとめて確認したい場合がある。ssコマンドに-tlnpオプションを付けると、TCPのLISTEN状態のソケットをポート番号とプロセス情報つきで一覧表示できる。

ssコマンドはデフォルトで接続済みソケットを表示する

オプションなしのssは、ESTABLISHEDなどの接続済みソケットを表示対象とする。LISTEN状態のソケットは含まれないため、リッスンポートを確認する目的には向かない。

$ ss
Netid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess

リッスン中のポートを確認するには、状態を絞り込むオプションが必要である。

-tでTCPソケットに絞る

-t(--tcp)オプションを付けると、TCPソケットだけに絞り込める。

$ ss -t
State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess

TCPソケットに絞っても、まだLISTEN状態のソケットは表示されない。

-lでLISTEN状態のソケットに絞る

-l(--listening)オプションを追加すると、LISTEN状態のソケットだけに絞り込める。

$ ss -tl
State  Recv-Q Send-Q Local Address:Port       Peer Address:PortProcess
LISTEN 0      1            0.0.0.0:postgresql      0.0.0.0:*
LISTEN 0      5            0.0.0.0:http            0.0.0.0:*

リッスン中のポートが表示された。ただしLocal Address:Portのポート部分は、/etc/servicesに登録があるとpostgresqlhttpのようにサービス名で表示される。

-nでポート番号を数値のまま表示する

-n(--numeric)オプションを付けると、サービス名への解決をスキップし、ポート番号を数値のまま表示する。

$ ss -tln
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      1            0.0.0.0:5432      0.0.0.0:*
LISTEN 0      5            0.0.0.0:80        0.0.0.0:*

postgresql5432http80と数値表示に変わった。ポート番号でgrepしたい場合や、サービス名を知らないポートを確認する場合は-nを付けた方が扱いやすい。

-pでプロセス情報を表示する

-p(--processes)オプションを付けると、そのポートをリッスンしているプロセス名・PID・ファイルディスクリプタが表示される。

$ sudo ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      1            0.0.0.0:5432      0.0.0.0:*    users:(("python3",pid=3250,fd=3))
LISTEN 0      5            0.0.0.0:80        0.0.0.0:*    users:(("python3",pid=3244,fd=3))

これで「どのポートを」「どのプロセスが」リッスンしているかが1コマンドで分かる。

プロセス情報の取得には権限が必要である。一般ユーザーで実行した場合、自分が所有していないプロセスの情報は空欄になる。

$ ss -tlnp
State  Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0      1            0.0.0.0:5432      0.0.0.0:*
LISTEN 0      5            0.0.0.0:80        0.0.0.0:*

他のユーザーが起動したプロセスの情報まで確認したい場合は、sudoを付けて実行する。

出力の見方

ss -tlnpの出力の各列は以下の通り。

内容
Stateソケットの状態(LISTENなど)
Recv-Q受信キューにあるバイト数(LISTEN時はバックログのキュー長)
Send-Q送信キューにあるバイト数(LISTEN時は許容する最大バックログ数)
Local Address:Portリッスンしているアドレスとポート番号
Peer Address:Port接続先のアドレスとポート番号(LISTEN時は*)
Processusers:(("プロセス名",pid=PID,fd=FD))形式のプロセス情報

Local Address:Port0.0.0.0の場合は全てのネットワークインターフェースで、127.0.0.1の場合はローカルホストからの接続のみでリッスンしている。

特定のポートだけ確認したい場合

ポート数が多い場合は、grepで絞り込むと見やすい。

$ sudo ss -tlnp | grep :80
LISTEN 0      5            0.0.0.0:80        0.0.0.0:*    users:(("python3",pid=3244,fd=3))

UDPも含めて確認したい場合

-tの代わりに、あるいは-tと併用して-u(--udp)オプションを付けると、UDPソケットも確認対象に含められる。UDPも含めたポート確認は特定ポートの使用状況を確認する(lsof, ss, netstat) を参照。

参考