- 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ページにあります。
コメントする