Linux lsof コマンドの使い方

  • Linuxは、バイトストリームを受け入れるまたは生成するデバイスをファイルとして扱うことで、幅広いリソースの処理を簡素化します。
  • lsof コマンドは、システム内のオープンファイル、およびファイルとして扱われるプロセスやデバイスを一覧表示するために使用できます。
  • lsofは、特定のプロセス、ディレクトリ、ユーザー、ポート、プロトコルによって開かれたファイルを検索し、各ファイルに関する詳細情報を提供するために使用できます。

Linuxのすべてがファイルである場合、ハードドライブ上のファイル以外にも存在する必要があります。このチュートリアルでは、ファイルとして扱われている他のすべてのデバイスおよびプロセスを表示するためにlsofを使用する方法を紹介します。

Linuxでは、すべてがファイルです

「Linuxのすべてがファイルである」というよく引用されるフレーズは、ある意味真実です。ファイルはバイトの集合です。プログラムに読み込まれたり、プリンターに送信されたりすると、バイトのストリームを生成しているように見えます。書き込まれると、バイトストリームを受け入れます。

キーボード、ソケット接続、プリンター、通信プロセスなど、他の多くのシステムコンポーネントは、バイトストリームを受け入れたり生成したりします。これらのデバイスは、バイトストリームを受け入れるか、生成するか、あるいは受け入れて生成するため、非常に低いレベルでファイルであるかのように扱われます。

この設計コンセプトは、Unixオペレーティングシステムの実装を簡素化しました。つまり、幅広いリソースを処理するために、少数のハンドラー、ツール、APIを作成できました。

ハードディスクにあるデータファイルとプログラムファイルは、単純な古いファイルシステムファイルです。ls コマンドを使用してそれらを一覧表示し、それらに関する詳細情報を取得できます。

ファイルとして扱われている他のすべてのプロセスやデバイスをどのように見つけますか?lsofコマンドを使用します。これにより、システム内のオープンファイルが一覧表示されます。つまり、ファイルであるかのように扱われているすべてのものを一覧表示します。

lsof コマンド

lsofで報告できるプロセスまたはデバイスの多くは、rootに属するか、rootによって起動されているため、lsofでsudoコマンドを使用する必要があります。

そして、このリストは非常に長くなるため、lessでもパイプします。

sudo lsof | less

lsof出力が表示される前に、GNOMEユーザーはターミナルウィンドウに警告メッセージが表示される場合があります。

<code>lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
Output information may be incomplete.</code>

lsofは、マウントされているすべてのファイルシステムを処理しようとします。この警告メッセージは、lsofがGNOME仮想ファイルシステム(GVFS)を検出したために表示されます。これは、ユーザー空間(FUSE)のファイルシステムの特殊なケースです。GNOME、そのAPI、およびカーネル間の橋渡しとして機能します。所有者(この場合はGNOME)以外は、誰もこれらのファイルシステムにアクセスできません。この警告は無視できます。

lsofの出力は非常に広範囲です。左端の列は次のとおりです。

右端の列は次のとおりです。

lsof列

すべての列がすべてのタイプのオープンファイルに適用されるわけではありません。そのうちのいくつかが空白であるのは正常です。

  • コマンド: ファイルを開いたプロセスに関連付けられたコマンドの名前。
  • PID: ファイルを開いたプロセスのプロセス識別番号。
  • TID: タスク(スレッド)識別番号。空白の列は、それがタスクではなくプロセスであることを意味します。
  • ユーザー: プロセスが属するユーザーのユーザーIDまたは名前、またはlsofがプロセスに関する情報を見つける/procディレクトリのディレクトリを所有しているユーザーのユーザーIDまたはログイン。
  • FD: ファイルのファイルディスクリプタを示します。ファイルディスクリプタについては以下で説明します。
  • タイプ: ファイルに関連付けられたノードのタイプ。タイプについては以下で説明します。
  • デバイス: 文字特殊、ブロック特殊、通常、ディレクトリ、NFSファイルのデバイス番号(カンマ区切り)が含まれているか、ファイルを識別するカーネル参照アドレスが含まれています。Linux AX.25ソケットデバイスの基本アドレスまたはデバイス名が表示される場合もあります。
  • サイズ/オフセット: ファイルのサイズまたはファイルオフセット(バイト単位)を示します。
  • ノード: ローカルファイルのノード番号、またはサーバーホストのNFSファイルのinode番号、またはインターネットプロトコルタイプを示します。ストリームのSTR、またはLinux AX.25ソケットデバイスのIRQまたはinode番号が表示される場合があります。
  • 名前: ファイルが存在するマウントポイントとファイルシステムの名前を示します。

FD列

FD列のファイルディスクリプタは、多くのオプションの1つになります。manページにすべてがリストされています。

FD列のエントリは、ファイルディスクリプタ、モード文字、ロック文字の3つの部分で構成できます。一般的なファイルディスクリプタをいくつか示します。

  • cwd: 現在の作業ディレクトリ。
  • err: FD情報エラー(NAME列を参照)。
  • ltx: 共有ライブラリテキスト(コードとデータ)。
  • m86: DOSマージマッピングファイル。
  • mem: メモリマップファイル。
  • mmap: メモリマップデバイス。
  • pd: 親ディレクトリ。
  • rtd: ルートディレクトリ。
  • txt: プログラムテキスト(コードとデータ)
  • ファイルディスクリプタを表す数字。

モード文字は次のいずれかになります。

  • r: 読み取りアクセス。
  • w: 書き込みアクセス。
  • u: 読み取りと書き込みのアクセス。
  • ' ': モードが不明でロック文字がない場合のスペース文字。
  • -: モードが不明でロック文字がある。

ロック文字は次のいずれかになります。

  • r: ファイルの一部に対する読み取りロック。
  • R: ファイル全体に対する読み取りロック。
  • w: ファイルの一部に対する書き込みロック。
  • W: ファイル全体に対する書き込みロック。
  • u: 長さにかかわらず読み取りと書き込みのロック。
  • U: ロックの種類が不明。
  • ' ': スペース文字。ロックなし。

TYPE列

TYPE列に表示される可能性のあるエントリは70以上あります。表示される一般的なエントリをいくつか示します。

  • REG: 通常のファイルシステムファイル。
  • DIR: ディレクトリ。
  • FIFO: 先入れ先出し。
  • CHR: 文字特殊ファイル。
  • BLK: ブロック特殊ファイル。
  • INET: インターネットソケット。
  • unix: UNIXドメインソケット

ファイルを開いたプロセスを表示

特定のファイルを開いたプロセスを表示するには、ファイルの名前をlsofのパラメーターとして指定します。たとえば、kern.logファイルを開いたプロセスを表示するには、次のコマンドを使用します。

sudo lsof /var/log/kern.log

lsofは、ユーザーsyslogによって開始された単一のプロセスrsyslogdを表示して応答します。

ディレクトリから開かれたすべてのファイルを表示

ディレクトリから開かれたファイルとそれらを開いたプロセスを表示するには、ディレクトリをlsofにパラメーターとして渡します。+D(ディレクトリ)オプションを使用する必要があります。

/var/log/ディレクトリで開かれているすべてのファイルを表示するには、次のコマンドを使用します。

sudo lsof +D /var/log/

lsofは、そのディレクトリ内のすべてのオープンファイルのリストで応答します。

/homeディレクトリから開かれたすべてのファイルを表示するには、次のコマンドを使用します。

sudo lsof +D /home

/homeディレクトリからファイルが開かれています。列の一部で説明が短くなっていることに注意してください。リスト全体が狭くなっています。

プロセスによって開かれたファイルのリスト

特定のプロセスによって開かれたファイルを表示するには、-c(コマンド)オプションを使用します。複数の検索語をlsofに一度に指定できることに注意してください。

sudo lsof -c ssh -c init

lsofは、コマンドラインで指定されたプロセスのいずれかによって開かれたファイルのリストを提供します。

ユーザーによって開かれたファイルを表示

特定のユーザーによって開かれたファイルに表示を制限するには、-u(ユーザー)オプションを使用します。この例では、Maryに代わって所有または起動されたプロセスによって開かれたファイルを見ていきます。

sudo lsof -u mary

リストされているすべてのファイルは、ユーザーMaryに代わって開かれています。これには、たとえば、デスクトップ環境によって開かれたファイルや、Maryがログインした結果として開かれたファイルが含まれます。

ユーザーによって開かれたファイルを除外

ユーザーによって開かれたファイルを排除するには、^演算子を使用します。リストからユーザーを除外すると、必要な情報を見つけやすくなります。以前のように-uオプションを使用し、ユーザー名の先頭に^文字を追加する必要があります。

sudo lsof +D /home -u ^mary

今回は、/homeディレクトリのリストに、ユーザーMaryによって開かれたファイルは含まれません。

プロセスによって開かれたファイルのリスト

特定のプロセスによって開かれたファイルのリストを表示するには、-p(プロセス)オプションを使用して、パラメーターとしてプロセスIDを指定します。

sudo lsof - p 4610

指定したプロセスIDによって開かれたすべてのファイルがリストされます。

ファイルを開いたプロセスIDのリスト

特定のファイルを開いたプロセスのプロセスIDを表示するには、-t(簡潔)オプションを使用して、コマンドラインにファイルの名前を指定します。

sudo lsof -t /usr/share/mime/mime.cache

プロセスIDは、シンプルなリストで表示されます。

ANDとOR検索を使用

SSHプロセスに関連する、ユーザーMaryによって開かれたファイルのリストを作成しましょう。コマンドラインに複数の検索項目を指定できることはわかっていますので、これは簡単でしょう。

sudo lsof -u mary -c ssh

それでは、lsofからの出力を確認しましょう。正しくないようです。出力には、rootによって開始されたエントリがあります。

これは、期待したものとは異なります。何が起こったのでしょうか?

複数の検索語を指定すると、lsofは最初の検索語または2番目の検索語などに一致するファイルすべてを返します。つまり、OR検索を実行します。

lsofにAND検索を実行させるには、-a(and)オプションを使用します。つまり、リストされるのは、最初の検索語と2番目の検索語などに一致するファイルのみになります。

もう一度試して、-aオプションを使用してみましょう。

sudo lsof -u mary -c ssh -a

これで、リスト内のすべてのファイルは、MaryによってまたはMaryに代わって開かれたものであり、SSHコマンドに関連付けられています。

ディスプレイの自動更新

+|-r(繰り返し)オプションを使用して、lsofを繰り返しモードにすることができます。繰り返しオプションは、+rまたは-rの2つの方法で適用できます。また、lsofがディスプレイを更新する前に待機する秒数も追加する必要があります。

いずれかの形式で繰り返しオプションを使用すると、lsofは通常どおり結果を表示しますが、ディスプレイの下部に破線の線が追加されます。コマンドラインで指定された秒数待ってから、新しい結果のセットでディスプレイを更新します。

-rオプションを使用すると、Ctrl+Cを押すまでこれが続行されます。+r形式では、表示する結果がなくなるか、Ctrl+Cを押すまで続行されます。

sudo lsof -u mary -c ssh -a -r5

リストの一番下にある破線を注意してください。これは、出力が更新されるときの新しいデータの表示を区切ります。

インターネット接続に関連付けられたファイルの表示

-i(インターネット)オプションを使用すると、ネットワークとインターネット接続に関連付けられたプロセスによって開かれたファイルを表示できます。

lsof -i

ネットワークとインターネット接続によって開かれたすべてのファイルが表示されます。

プロセスIDによるインターネット接続に関連付けられたファイルの表示

特定のプロセスIDに関連付けられたインターネット接続によって開かれたファイルを表示するには、-pオプションと-aオプションを追加します。

ここでは、IDが606のプロセスによる、インターネットまたはネットワーク接続によって開かれたファイルを探しています。

sudo lsof -i -a -p 606

インターネットまたはネットワーク接続に関連付けられたプロセスID 606によって開かれたすべてのファイルが表示されます。

インターネット接続とコマンドに関連付けられたファイルの表示

-c(コマンド)オプションを使用して、特定のプロセスによって開かれたファイルを探すことができます。sshプロセスに関連付けられたインターネットまたはネットワーク接続によって開かれたファイルを探すには、次のコマンドを使用します。

lsof -i -a -c ssh

sshプロセスによって開かれたすべてのファイルが出力にリストされます。

インターネット接続とポートに関連付けられたファイルの表示

特定のポートでインターネットまたはネットワーク接続によって開かれたファイルについて、lsofでレポートを作成できます。これを行うには、:文字の後にポート番号を続けます。

ここでは、lsofにポート22を使用してネットワークまたはインターネット接続によって開かれたファイルのリストを表示するよう求しています。

lsof -i :22

リストされたすべてのファイルは、ポート22(SSH接続のデフォルトポート)に関連付けられたプロセスによって開かれました。

インターネット接続とプロトコルに関連付けられたファイルの表示

特定のプロトコルを使用しているネットワークとインターネット接続に関連付けられたプロセスによって開かれたファイルを、lsofに表示させることができます。TCP、UDP、SMTPから選択できます。TCPプロトコルを使用して、何が得られるかを見てみましょう。

sudo lsof -i tcp

リストされたファイルは、TCPプロトコルを使用しているプロセスによって開かれたもののみです。

表面を少しだけなぞっただけ

これらはlsofの一般的なユースケースに関する基本的な知識ですが、他にもたくさんあります。manページが2,800行以上あるという事実から、その量を判断することができます。

lsofコマンドは、オープンファイルと疑似ファイルの層をさらに深く掘り下げるために使用できます。私たちはスケッチマップを提供しました。アトラスはmanページにあります。