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 |
-iTCP | TCPポートを指定する ※範囲指定も可能 例 # lsof iTCP:80 ポート80/tcpだけに限定して結果を表示 # lsof iTCP1-1024 ポート1から1024/tcpだけに限定して結果を表示 |
-iUDP | UDPポートを指定する ※範囲指定も可能 例 # lsof -iUDP:53 # lsof -iUDP:1-1024 |
-n | 実行結果をIP表示にする |
-P | ポート番号を数値表示にする |
-a | and条件で絞り込みする # lsof -c sshd -a -i4 sshのプロセスとIPv4のAND条件で絞り込みする |
lsofのオプションの活用例
1.ファイル名から利用プロセスを確認する方法
lsof /var/log/messages
【画面1】
(コマンド1)->messagesファイルが利用しているプロセスを確認します。
(解説1)->rootユーザでrsyslogdが利用していることがわかります。プロセスIDは「756」を使用しています。
2.ユーザIDから利用プロセス名(PID)とファイル名を確認する方法
lsof -u WWW |more
【画面2】
(コマンド1)->ユーザID「www」が利用しているプロセス名とファイル名を確認します。
(解説1)->「www」ユーザだけに絞って一覧が表示されている。主にWEBアプリケーション(nginx)サービスで利用されていることが確認できます。また、WEBサーバで利用する共有ライブライリー(.so)のファイルを主に参照されています。
3.プロセス名から利用ユーザIDとファイル名を確認する方法
lsof -c sshd
【画面3】
(コマンド1)->「sshd」のプロセスが利用しているユーザIDとファイル名を確認します。
(解説1)->「sshd」プロセスだけに絞って一覧が表示されています。SSHサーバで利用する共有ライブライリー(.so)のファイルが参照されています。
4.通信ポートの状態を確認する方法(ネットワークの利用ポートの確認)
lsof -i4:22 -P
【画面4】
(コマンド1)->SSHで利用する通信ポート「22/tcp(IPv4)」の状態を確認します。
(解説1)->通信ポート「22/tcp(IPv4)」を利用しているネットワークポートだけに絞って一覧が表示されています。sshdがListenであること、sshでアクセスしている端末(利用者:IPアドレス)が確認できます。
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アクセスしていることがわかります。
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)でアクセスしていることは確認できません。
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」だけであることが確認できます。
8.ネットワーク接続に関連している起動プロセスとユーザ及びIPアドレスの関係を確認する方法
【画面8】
(コマンド1)->lsofの「-Pni」オプションで、サーバすべての通信状態を確認することができます。
(解説1)->ネットワークを利用している、「起動プロセス名」と「そのユーザID」、加えてlsofを実行しているサーバへ接続している「別サーバのIPアドレス」などを確認できます。
コメント