lsof は List Open Files の略です。
lsof コマンドは、「ls + of」と考えると覚えやすいです。ここで、ls はリストを表し、of は開いているファイルを表します。
これは、さまざまなプロセスによって開かれたファイルに関する情報を一覧表示するために使用されるコマンド ライン ユーティリティです。 UNIX では、すべてがファイルです (パイプ、ソケット、ディレクトリ、デバイスなど)。したがって、lsof を使用すると、開いているファイルに関する情報を取得できます。
1. lsof の紹介
lsof と入力するだけで、すべてのアクティブなプロセスに属するすべての開いているファイルのリストが表示されます。
# lsof COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root 0u CHR 1,3 0t0 4369 /dev/null init 1 root 1u CHR 1,3 0t0 4369 /dev/null init 1 root 2u CHR 1,3 0t0 4369 /dev/null init 1 root 3r FIFO 0,8 0t0 6323 pipe ...
デフォルトでは、1 行に 1 ファイルが表示されます。ほとんどの列は一目瞭然です。いくつかの不可解な列 (FD と TYPE) について詳しく説明します。
FD – ファイル記述子を表します。 FD の値のいくつかは、
- cwd – 現在の作業ディレクトリ
- txt – テキスト ファイル
- mem – メモリ マップ ファイル
- mmap – メモリ マップ デバイス
- NUMBER – 実際のファイル記述子を表します。数字の後の文字、つまり「1u」は、ファイルが開かれるモードを表します。 r は読み取り、w は書き込み、u は読み取りと書き込み
TYPE – ファイルのタイプを指定します。 TYPE の値の一部は、
- REG – 通常のファイル
- DIR – ディレクトリ
- FIFO – 先入れ先出し
- CHR – キャラクタースペシャルファイル
FD と TYPE の完全なリストについては、man lsof を参照してください。
2.特定のファイルを開いたプロセスを一覧表示
ファイル名を引数として指定することにより、特定のファイルを開いたプロセスのみを一覧表示できます。
# lsof /var/log/syslog COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog
3.ディレクトリの下で開いているファイルを一覧表示
「+D」オプションを使用して、指定したディレクトリの下でファイルを開いたプロセスを一覧表示できます。 +D サブディレクトリも再帰します。 lsof を再帰させたくない場合は、「+d」オプションを使用してください。
# lsof +D /var/log/ COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rsyslogd 488 syslog 1w REG 8,1 1151 268940 /var/log/syslog rsyslogd 488 syslog 2w REG 8,1 2405 269616 /var/log/auth.log console-k 144 root 9w REG 8,1 10871 269369 /var/log/ConsoleKit/history
4.で始まるプロセス名に基づいて、開いているファイルを一覧表示します
「-c」オプションを使用して、文字列で始まるプロセス名によって開かれたファイルを一覧表示できます。 -c の後にプロセス名を指定すると、そのプロセス名で始まるプロセスによって開かれたファイルが一覧表示されます。 1 つのコマンド ラインで複数の -c スイッチを指定できます。
# lsof -c ssh -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root txt REG 8,1 124704 917562 /sbin/init init 1 root mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so init 1 root mem REG 8,1 30684 1442694 /lib/i386-linux-gnu/librt-2.13.so ... ssh-agent 1528 lakshmanan 1u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 2u CHR 1,3 0t0 4369 /dev/null ssh-agent 1528 lakshmanan 3u unix 0xdf70e240 0t0 10464 /tmp/ssh-sUymKXxw1495/agent.1495
5.マウント ポイントを使用してプロセスを一覧表示する
ディレクトリをマウント解除しようとすると、システムは「デバイスまたはリソースがビジーです」というエラーを表示します。そのため、マウント ポイントを使用しているすべてのプロセスを特定し、それらのプロセスを強制終了してディレクトリをアンマウントする必要があります。 lsof を使用することで、それらのプロセスを見つけることができます。
# lsof /home
以下も動作します。
# lsof +D /home/
6.特定のユーザーが開いたファイルを一覧表示
特定のユーザーが開いたファイルのリストを見つけるには、「-u」オプションを使用してください。
# lsof -u lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME update-no 1892 lakshmanan 20r FIFO 0,8 0t0 14536 pipe update-no 1892 lakshmanan 21w FIFO 0,8 0t0 14536 pipe bash 1995 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan
場合によっては、すべてのユーザーが開いているファイルを一覧表示したい場合があります。1 つまたは 2 つを期待してください。その場合、次のように「^」を使用して特定のユーザーのみを除外できます。
# lsof -u ^lakshmanan COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME rtkit-dae 1380 rtkit 7u 0000 0,9 0 4360 anon_inode udisks-da 1584 root cwd DIR 8,1 4096 2 /
上記のコマンドは、ユーザー「lakshmanan」以外のすべてのユーザーによって開かれたすべてのファイルを一覧表示します。
7.特定のプロセスで開いているすべてのファイルを一覧表示
「-p」オプションを使用して、特定のプロセスによって開かれたすべてのファイルを一覧表示できます。特定のプロセスに関する詳細情報を取得すると役立つ場合があります。
# lsof -p 1753 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME bash 1753 lakshmanan cwd DIR 8,1 4096 393571 /home/lakshmanan/test.txt bash 1753 lakshmanan rtd DIR 8,1 4096 2 / bash 1753 lakshmanan 255u CHR 136,0 0t0 3 /dev/pts/0 ...
8.特定のユーザーに属するすべてのプロセスを強制終了
特定のユーザーによってファイルが開かれているすべてのプロセスを強制終了したい場合は、「-t」オプションを使用してプロセスのプロセス ID のみを出力し、次のように kill に渡すことができます
# kill -9 `lsof -t -u lakshmanan`
上記のコマンドは、ファイルが開かれているユーザー「lakshmanan」に属するすべてのプロセスを強制終了します。
同様に、「-t」もさまざまな方法で使用できます。たとえば、/var/log/syslog を開いたプロセスのプロセス ID を一覧表示するには、
# lsof -t /var/log/syslog 489
kill について言えば、プロセスを強制終了するには 4 つの方法があることをご存知ですか?
9. OR/AND を使用してさらにリスト オプションを組み合わせる
デフォルトでは、lsof で複数のリスト オプションを使用すると、それらは OR されます。たとえば、
# lsof -u lakshmanan -c init COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME init 1 root cwd DIR 8,1 4096 2 / init 1 root txt REG 8,1 124704 917562 /sbin/init bash 1995 lakshmanan 2u CHR 136,2 0t0 5 /dev/pts/2 bash 1995 lakshmanan 255u CHR 136,2 0t0 5 /dev/pts/2 ...
上記のコマンドは、'-u' と '-c' の 2 つのリスト オプションを使用します。したがって、このコマンドは、ユーザー「lakshmanan」に属するプロセスと、「init」で始まるプロセス名をリストします。
ただし、ユーザー「lakshmanan」に属し、プロセス名が「init」で始まるプロセスを一覧表示する場合は、「-a」オプションを使用できます。
# lsof -u lakshmanan -c init -a
ユーザー「lakshmanan」に属する「init」という名前のプロセスがないため、上記のコマンドは何も出力しません。
10.繰り返しモードで lsof を実行
lsof は繰り返しモードもサポートしています。最初に指定されたパラメーターに基づいてファイルを一覧表示し、指定された秒数だけ遅延してから、指定されたパラメーターに基づいてファイルを再度一覧表示します。信号で中断できます。
「-r」または「+r」を使用すると、繰り返しモードを有効にできます。 「+r」を使用すると、開いているファイルが見つからない場合に繰り返しモードが終了します。 「-r」は、ファイルが開かれているかどうかに関係なく、割り込みが発生するまでリスト、遅延、リストを続行します。
各サイクル出力は、「=======」を使用して区切られます。また、時間遅延を「-r」として指定します | 「+r」.
# lsof -u lakshmanan -c init -a -r5 ======= ======= COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME inita.sh 2971 lakshmanan cwd DIR 8,1 4096 393218 /home/lakshmanan inita.sh 2971 lakshmanan rtd DIR 8,1 4096 2 / inita.sh 2971 lakshmanan txt REG 8,1 83848 524315 /bin/dash inita.sh 2971 lakshmanan mem REG 8,1 1434180 1442625 /lib/i386-linux-gnu/libc-2.13.so inita.sh 2971 lakshmanan mem REG 8,1 117960 1442612 /lib/i386-linux-gnu/ld-2.13.so inita.sh 2971 lakshmanan 0u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 1u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 2u CHR 136,4 0t0 7 /dev/pts/4 inita.sh 2971 lakshmanan 10r REG 8,1 20 393578 /home/lakshmanan/inita.sh =======
上記の出力では、最初の 5 秒間は何も出力されません。その後、「inita.sh」という名前のスクリプトが開始され、出力が一覧表示されます。
ネットワーク接続を検索しています
ネットワーク接続もファイルです。そのため、lsof を使用してそれらに関する情報を見つけることができます。
11.すべてのネットワーク接続を一覧表示
「-i」オプションを使用すると、開いているすべてのネットワーク接続を一覧表示できます。
# lsof -i COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME avahi-dae 515 avahi 13u IPv4 6848 0t0 UDP *:mdns avahi-dae 515 avahi 16u IPv6 6851 0t0 UDP *:52060 cupsd 1075 root 5u IPv6 22512 0t0 TCP ip6-localhost:ipp (LISTEN)
「-i4」または「-i6」を使用して、それぞれ「IPV4」または「IPV6」のみをリストすることもできます。
12.特定のプロセスで使用されているすべてのネットワーク ファイルを一覧表示
次のように、プロセスによって使用されているすべてのネットワーク ファイルを一覧表示できます
# lsof -i -a -p 234
以下も使用できます
# lsof -i -a -c ssh
上記のコマンドは、ssh で始まるプロセスによって開かれたネットワーク ファイルを一覧表示します。
13.特定のポートでリッスンしているプロセスを一覧表示
次のように「-i」と「:」を使用して、特定のポートでリッスンしているプロセスを一覧表示できます
# lsof -i :25 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME exim4 2541 Debian-exim 3u IPv4 8677 TCP localhost:smtp (LISTEN)
14.すべての TCP または UDP 接続を一覧表示
「-i」を使用してプロトコルを指定すると、すべての TCP または UDP 接続を一覧表示できます。
# lsof -i tcp; lsof -i udp;
15.すべてのネットワーク ファイル システム ( NFS ) ファイルを一覧表示
「-N」オプションを使用して、すべての NFS ファイルを一覧表示できます。次の lsof コマンドは、ユーザー「lakshmanan」が使用するすべての NFS ファイルを一覧表示します。
# lsof -N -u lakshmanan -a