プロセスが開いているファイルを表示するコマンド「lsof」は、プロセスやソケットなどのあらゆる情報をファイルの形で管理するUNIX/Linuxの特性を生かしたもの。プロセスが使用するポートの調査に役立ちます。
本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回は、プロセスが開いているファイルを調べる際に使う「lsof」コマンドを紹介します。
なお、本連載では、執筆時点の最新版「Red Hat Enterprise Linux(RHEL)」および「CentOS」環境で動作を確認しています。また、用法事例はIPv4(Internet Protocol version 4)ネットワークを前提にしています。コマンドのサンプルなどで一部環境に依存した出力例となる場合がありますので、その際には適宜ご自身の環境に合わせて読み替えてください。
lsof [オプション[:[ポート番号|サービス]] [ファイル|プロセス]
※[ ]は省略可能な引数を示しています。|で区切った項目は、どちらか一つを指定します。
lsofコマンドは「LiSt Open Files」(開いているファイル群を列挙する)という言葉に由来します。その名の通り、「プロセスが開いているファイル」を表示するコマンドです。
UNIX/Linuxでは、一般的なファイルだけでなく、ネットワークソケットやデバイスドライバー、プロセス情報なども「ファイル」として扱います。そのため、開かれているファイルを調べることで、待機ポートやネットワークのマッピング情報などを把握できます。lsofコマンドによって「あるファイルを開いているプロセス」「あるポートにアクセスしているプロセス」を特定し、「不要なプログラムが実行されていないか」「不正なプログラムが動作していないか」を調べることができます。
引数にファイルを与えて実行すると、そのファイルを使用中のプロセスID(PID)の一覧が出力されます。
lsofコマンドの主なオプションは次の通りです(表1)。
オプション | 意味 |
---|---|
-P | ポート番号をサービス名に変換しない |
-c | プロセス名を指定する |
-i | ネットワークソケットファイルを表示する |
-n | IPアドレスを表示する(名前解決しない) |
-p | プロセスIDを指定する |
「-c」オプションに続けてプロセス名を指定すると、そのプロセスが開いているファイルを特定できます。プロセス名ではなくPIDで絞り込む場合には、「-p」オプションを利用します。
待機ポートを確認する場合は、「-i」オプションを利用します。引数を指定しない場合は、全てのポートを対象に使用の有無を確認できます。ポートで絞り込む場合は、「i:XXXX」の要領でポート番号を指定します。
なお、lsofコマンドで表示できるファイル/ポートは、lsofコマンドを実行するユーザーに対し読み取り権限が与えられているものに限られます。ネットワークソケットファイルは一般ユーザーに対し読み取り権限が与えられていないため、多くの場合はrootまたはsudoコマンドと組み合わせて、管理者権限で実行します。
ローカルホストの待機ポートとプロセスを一覧する場合は、ネットワークソケットファイルを表示するオプション「-i」を引数なしで実行します。
このとき、IPアドレスをホスト名に変換しないように「-n」オプションを、ポート番号をサービス名に変換しないように「-P」オプションを併せて指定すると、高速に結果が得られます。
出力される項目の内容と意味は表2の通りです。
項目 | 意味 |
---|---|
COMMAND | 実行中のプログラム |
PID | プロセス番号 |
USER | 実行ユーザー |
FD | ファイルディスクリプター(/proc/<PID>/fd) |
TYPE | ファイル種別 |
DEVICE | デバイス番号 |
SIZE/OFF | ファイルサイズ |
NODE | プロトコル |
NAME | ファイルまたはポート |
待ち受け状態のポートは「(LISTEN)」と表示されています。下の実行例では、Sambaサーバーのデーモン(smbd)が待ち受け状態になっており、該当のポートとプロセスIDが分かります。
$ sudo lsof -i -n -P COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 742 avahi 12u IPv4 16986 0t0 UDP *:5353 avahi-dae 742 avahi 13u IPv4 16987 0t0 UDP *:46148 chronyd 757 chrony 1u IPv4 16594 0t0 UDP *:123 chronyd 757 chrony 2u IPv6 16595 0t0 UDP *:123 ・ ・ smbd 2198 root 27u IPv4 7258 0t0 TCP *:445 (LISTEN) smbd 2198 root 28u IPv4 7260 0t0 TCP *:139 (LISTEN) ・ ・
特定のポート番号で実行中のプロセスを調べる場合には、「-i:XX」の要領で「-i」オプションに続けてポート番号を指定します。sshdは22番、httpdは80番などと主要なサービスにはポート番号が割り当てられているため(ウェルノウンポート)、通常はその番号を指定します。
なお、「-i」オプションではポート番号だけでなく、サービス名も指定できます。例えば、sshに関するサービスを調べる場合は「-i:ssh」の要領で指定します。
下の実行例では、22番ポートで実行中のプロセスを表示しています。
$ sudo lsof -i:22 -P COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME sshd 2364 root 3u IPv4 918 0t0 TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED) sshd 2368 pi 3u IPv4 918 0t0 TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED) sshd 2490 root 3u IPv4 8220 0t0 TCP *:22 (LISTEN)
Copyright © ITmedia, Inc. All Rights Reserved.