Linuxでポート番号からプロセスIDを調べる方法

HTTPサービスであればTCP 80番ポート、HTTPS(SSL)サービスであればTCP 443番ポートのように、サーバサービスはそれぞれのポートの待ち受けをしているケースが多いと思います。

ポート番号の説明は、ウィキペディアに任せるとして、待ち受けているポート番号が一体どのプロセスで動いているのか分からない・・・といった自体に遭遇することがあります。

そういったケースでの調査方法の流れについて説明したいと思います。

シナリオ

35604ポートは一体どんなプロセスなのか?というケースを考えてみます。

# netstat -tanu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN
tcp        0      0 127.0.0.1:8080          0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN
tcp        0      0 0.0.0.0:35604           0.0.0.0:*               LISTEN
・・・省略

などの方法で35604/tcpが待ち受けていることが分かったとします。

調査手順

lsof -n -P -i:調べたいポート番号 というコマンドを使います。今回のシナリオに当てはめるとこうなります。

# lsof -n -P -i:35604
COMMAND     PID    USER   FD   TYPE   DEVICE SIZE/OFF NODE NAME
rpc.statd 26694 rpcuser    9u  IPv4 11730835      0t0  TCP *:35604 (LISTEN)

上記の調査で、rpc.statd というプロセスID26694が該当するということが分かりました。

調査で分かったサービスを強制停止する場合

通常は、serviceコマンドや、systemctlコマンドでサービスを停止させることが好ましいですが、前項で判明したプロセスIDを強制的に停止する場合は以下の流れで実施します。

プロセスIDを確認する。

# ps -ef | grep 26694
root     11460 14276  0 22:34 pts/0    00:00:00 grep --color=auto 26694
rpcuser  26694     1  0  3月19 ?      00:00:00 /usr/sbin/rpc.statd --no-notify

プロセスを強制停止する。

# kill -9 26694
norikazum