【lsof】「ファイルオープンしているプロセス」「ユーザが利用しているプロセス」「通信相手と通信ポート」を特定する使い方を解説

Linuxサーバ

RHEL系(CentOS)
---

サーバ運用では、障害対応で「lsof」コマンドをよく利用します。

・ファイル名からそのファイルが利用しているプロセスを特定
・サーバに登録があるユーザIDからユーザが利用しているプロセスを特定
・サーバにアクセスするIPアドレスや通信ポートを特定


これらの特定方法を解説します。

スポンサーリンク

lsofコマンドのオプション

よく利用するlsofオプション

オプション説明
-uユーザIDから利用しているプロセスを特定する


# lsof -u root
rootユーザが利用しているプロセスがわかる
-cプロセス名から利用しているファイル名、ユーザIDなど
を特定する


# lsof -c sshd
-iネットワーク接続を特定する


# lsof -i
4:IPv4に限定する
※IPv6を除いて表示できる


# lsof -i4
-iTCPTCPポートを指定する
※範囲指定も可能


# lsof iTCP:80
ポート80/tcpだけに限定して結果を表示

# lsof iTCP1-1024
ポート1から1024/tcpだけに限定して結果を表示
-iUDPUDPポートを指定する
※範囲指定も可能


# lsof -iUDP:53
# lsof -iUDP:1-1024
-n実行結果をIP表示にする
-Pポート番号を数値表示にする
-aand条件で絞り込みする

# lsof -c sshd -a -i4
sshのプロセスとIPv4のAND条件で絞り込みする

lsofのオプションの活用例

1.ファイル名から利用プロセスを確認する方法

lsof  /var/log/messages

【画面1】
(コマンド1)->messagesファイルが利用しているプロセスを確認します。
(解説1)->rootユーザでrsyslogdが利用していることがわかります。プロセスIDは「756」を使用しています。

画面1

2.ユーザIDから利用プロセス名(PID)とファイル名を確認する方法

lsof -u  WWW |more

【画面2】
(コマンド1)->ユーザID「www」が利用しているプロセス名とファイル名を確認します。
(解説1)->「www」ユーザだけに絞って一覧が表示されている。主にWEBアプリケーション(nginx)サービスで利用されていることが確認できます。また、WEBサーバで利用する共有ライブライリー(.so)のファイルを主に参照されています。

画面2

3.プロセス名から利用ユーザIDとファイル名を確認する方法

lsof -c sshd

【画面3】
(コマンド1)->「sshd」のプロセスが利用しているユーザIDとファイル名を確認します。
(解説1)->「sshd」プロセスだけに絞って一覧が表示されています。SSHサーバで利用する共有ライブライリー(.so)のファイルが参照されています。

画面3

4.通信ポートの状態を確認する方法(ネットワークの利用ポートの確認)

lsof -i4:22 -P

【画面4】
(コマンド1)->SSHで利用する通信ポート「22/tcp(IPv4)」の状態を確認します。
(解説1)->通信ポート「22/tcp(IPv4)」を利用しているネットワークポートだけに絞って一覧が表示されています。sshdがListenであること、sshでアクセスしている端末(利用者:IPアドレス)が確認できます。

画面4

5.利用者が使用している通信ポートとプロセス名を確認する方法

lsof -i@192.168.11.17 -n

【画面5】
(コマンド1)->「192.168.11.17」の利用者が、このサーバに対してどのような接続(通信)をしているか?を確認します。
(解説1)->利用者「192.168.11.17」が、このサーバのssh(22/tcp)とhttp(80/tcp)を利用していることが確認できます。
この事から利用者「192.168.11.17」は、TeraTermなどでSSH接続していること、ブラウザなどを利用してWEBアクセスしていることがわかります。

画面5

6.AND条件(論理積)を利用して絞り込みする方法(すべての条件に合致した場合)

■AND条件を利用していない場合

lsof -P -n -i@192.168.11.17 

【画面6】
(コマンド1)->「192.168.11.17」の利用者が、このサーバに対してどのような接続(通信)をしているか?を確認します。
(解説1)->利用者「192.168.11.17」が、このサーバのssh(22/tcp)とhttp(80/tcp)を利用していることが確認できます。

■AND条件を利用している場合

lsof -P -n -i@192.168.11.17 -a -c sshd

【画面6】
(コマンド2)->「192.168.11.17」の利用者が、このサーバのsshdサービス(22/tcp)を利用していなか?条件を絞って確認します。
※「-a」がand条件のオプション
(解説2)->利用者「192.168.11.17」が、このサーバのssh(22/tcp)を利用していることが確認できます。
条件を絞っているため、利用者「192.168.11.17」が、http(80/tcp)でアクセスしていることは確認できません。

画面6

7.通信プロトコル(TCP・UDP)と通信ポートの範囲を指定する方法

TCPの通信プロトコルを利用

lsof -P -n -iTCP

【画面7】
(コマンド1)->「tcp」の通信プロトコルに絞って、コマンド実行時の利用状況を確認します。
(解説1)->このサーバで利用できるTCPの通信プロトコルは、SSHサービス「22/tcp」、WEBサービス「80/tcp」、「25/tcp」だけであることが確認できます。
※2つ「ESTABLISHED」となっている「22/tcp」が2セションで利用中で、後のTCPポートは「Listen」で待ち受け状態になっていることが確認できます。

TCPの通信プロトコルとポート番号を「1/tcp」~「22/tcp」に限定

lsof -P -n -iTCP:1-22

【画面7】
(コマンド2)->「TCP」の通信プロトコルのポート「1/tcp」~「22/tcp」までを利用しているものに絞って確認します。
(解説2)->「TCP」の通信プロトコルのポート番号を「1/tcp」~「22/tcp」に限定すると結果、ポート「22/tcp」のみ利用可能であることが確認できます。
※条件を絞っているので、WEBサービス「80/tcp」、「25/tcp」は出力結果に表示されません。

UDPの通信プロトコルを利用

lsof -P -n -iUDP

【画面7】
(コマンド3)->「udp」の通信プロトコルに絞って、コマンド実行時の利用状況を確認します。
(解説2)->このサーバで利用していたUDPの通信プロトコルは、「323/udp」、「68/tcp」だけであることが確認できます。

画面7

8.ネットワーク接続に関連している起動プロセスとユーザ及びIPアドレスの関係を確認する方法

【画面8】
(コマンド1)->lsofの「-Pni」オプションで、サーバすべての通信状態を確認することができます。
(解説1)->ネットワークを利用している、「起動プロセス名」と「そのユーザID」、加えてlsofを実行しているサーバへ接続している「別サーバのIPアドレス」などを確認できます。

画面8

コメント

タイトルとURLをコピーしました