GNU/Linux >> Linux の 問題 >  >> Linux

15 Linux lsof コマンドの例 (開いているファイルの識別)

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

Linux
  1. 7Linuxでのlsofコマンドの例

  2. Linux での rm コマンドの例

  3. Linux での ps コマンドの例

  1. Linuxでのrsyncコマンドの実用例

  2. w Linux でのコマンド例

  3. Linux での diff コマンドの例

  1. Linux ls コマンド - ファイルの一覧表示

  2. 7 Linux df コマンドの例

  3. 8 Linux TR コマンドの例