ある時点で、プロセスまたはユーザーによって開かれたファイルを表示する方法があるかどうか疑問に思ったことがあると思います。良いことは、その質問に対する答えがlsofコマンドであるということです。
lsコマンドが「list」の略であることはすでにご存知でしょう。 lsofは「ListOpenFiles」の略です。そして、それはまさにそれが行うことであり、プロセス、ユーザー、およびプロセスIDごとに開いているファイルを一覧表示します。
lsofコマンドの最も一般的な使用法のいくつかを紹介します。
lsofコマンドの例
オプションと引数を指定せずにlsofコマンドを使用すると、システム内のすべてのプロセスによって開かれているすべてのファイルが一覧表示されます。
lsof
出力は次のようになります:
COMMAND PID TID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 252,1 4096 2 /
systemd 1 root rtd DIR 252,1 4096 2 /
systemd 1 root txt REG 252,1 1595792 17384 /lib/systemd/systemd
systemd 1 root mem REG 252,1 1700792 2077 /lib/x86_64-linux-gnu/libm-2.27.so
出力はほとんど自明ですが、FD列とTYPE列について疑問に思うかもしれません。
FDはファイル記述子を意味します。 FDの一般的な値のいくつかは次のとおりです。
- cwd –現在の作業ディレクトリ
- txt –テキストファイル
- mem –メモリマップトファイル
- mmap –メモリマップドデバイス
- NUMBER –実際のファイル記述子。また、開いているファイルのアクセス許可に関する情報もあります。
TYPEは簡単です。ファイルタイプを指定します。次にいくつかの例を示します。
- REG –通常のファイル
- DIR –ディレクトリ
- CHR –キャラクター特殊ファイル
- FIFO –先入れ先出し
私を信じて。引数なしでlsofコマンドを実行することは望ましくありません。
なぜ私はこれを言うのですか?画面に何千もの結果が殺到し始めるからです。
Ubuntuサーバーでlsofコマンドを実行し、wcコマンドで行数を数えると、結果は次のようになります。
lsof | wc -l
11432
はい!それは正しい。システム内のさまざまなプロセスによって開かれたファイルは11,000を超えています。
心配しないで。 lsofコマンドは、どのプロセスがどのファイルを開き、どのファイルがどのプロセスによって開かれるかを確認できるため、デバッグに非常に役立ちます。
rootとしてログインしていない場合、lsofコマンドの出力は非常に制限されます。 root以外のユーザーとしてログインしている場合は、sudoを使用することをお勧めします。
1。ファイルを開いたすべてのプロセスを一覧表示します
これは簡単です。ファイルへのパスを指定するだけです。
lsof <path_to_file>
2。ユーザーが開いたすべてのファイルを一覧表示します
これは、マルチユーザー環境で役立ちます。次の方法で、特定のユーザーが開いたすべてのファイルを一覧表示できます。
lsof -u <user_name>
次のように複数のユーザーを指定することもできます:
lsof -u user1, user2
またはこのように:
lsof -u user1 -u user2
3。ディレクトリ内の開いているすべてのファイルを一覧表示する
特定のディレクトリでどのファイルが開かれたか疑問に思っている場合は、+Dオプションを指定してlsofコマンドを使用できます。
lsof +D <path_to_directory>
検索は再帰的です。そのため、上記のディレクトリで開いているすべてのファイルとそのすべてのサブディレクトリが一覧表示されます。
4。プロセスごとに開いているすべてのファイルを一覧表示する
この場合、プロセスID(pid)を知っている必要があります。プロセスIDがわかっている場合は、lsofコマンドの-pオプションを使用して、プロセスIDによって開かれているファイルを見つけることができます。
lsof -p <pid>
複数のプロセスIDを指定することもできます。
lsof -p pid1, pid2, pid3
5。コマンドによって開かれたすべてのファイルを一覧表示します
これは、デバッグに特に役立ちます。 httpデーモンで使用されているファイルを確認したい場合は、コマンド名(この例ではhttpd)を指定するだけです。
lsof -c <command>
6。ユーザーとコマンドまたはプロセスによって開かれた検索
–aオプションを使用して、ユーザーやコマンドなどのオプションとプロセスを組み合わせることができます。 AND演算子と考えてください。これにより、検索を絞り込もうとしているときに、追加のフィルターが提供されます。
lsof -a -u user_name -c command_name
7。 lsofコマンドを使用してネットワーク接続とポートを一覧表示する
lsofコマンドを使用して、開いているポートを検索したり、ポートを使用しているプロセスを検索したりすることもできます。
-iオプションを使用すると、開いているすべての種類のポートをファイリングできます。
lsof -i
出力は次のようになります:
lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
sshd 920 root 3u IPv4 20507 0t0 TCP *:ssh (LISTEN)
sshd 920 root 4u IPv6 20535 0t0 TCP *:ssh (LISTEN)
docker-pr 1163 root 4u IPv6 21687 0t0 TCP *:https (LISTEN)
docker-pr 1175 root 4u IPv6 21717 0t0 TCP *:http (LISTEN)
sshd 7528 root 3u IPv4 39506588 0t0 TCP testing:ssh->212.91.91.19:58904 (ESTABLISHED)
systemd-r 10993 systemd-resolve 12u IPv4 20901990 0t0 UDP localhost:domain
systemd-r 10993 systemd-resolve 13u IPv4 20901991 0t0 TCP localhost:domain (LISTEN)
ネットワーク接続の種類を指定することもできます。たとえば、開いているすべてのTCPポートを一覧表示するには、次を使用できます。
lsof -i tcp
特定のポートを使用しているプロセスを見つけるには、ポート番号を指定できます。
lsof -i :<port_number>
ボーナスのヒント:lsofで否定演算子を使用する
否定演算子を使用して、lsofコマンドの使用中にユーザーまたはプロセスを除外できます。
たとえば、root以外のユーザーが開いたすべてのファイルを一覧表示する場合は、次のように使用します。
lsof -u ^root
lsofコマンドは、grepコマンドと一緒に使用するとさらに便利になります。
この記事で何か新しいことを学んだことを願っています。ご質問やご提案がございましたら、下にコメントを残してください。