Linux の “lsof” コマンドツールは、「開いているファイルのリスト」をチェックするのに非常に便利な数多くの組み込みツールの1つです。 そう、”lsof” はこのタスクの略称です。
システム内では常に多くのプロセスが動作しており、システムのさまざまなファイルにアクセスしています。 これらのファイルは、ディスクファイル、スクリプト、ネットワークソケット、デバイス、名前付きパイプ、その他である可能性がある。 lsof」を使用すると、デバッグなど多くのことを実行することができます。 また、システム管理者にとっても、どのファイルがどのプロセスによってアクセスされているかを把握するのに非常に有効です。 私が発見した最も有用なシナリオの 1 つは、ファイルシステムをアンマウントしようとしているが、まだアクセスされている場合です。
さっそく、「lsof」を使ってみましょう! 現在の UNIX/Linux システムには、すでに「lsof」がインストールされていると仮定します。

これはコマンド、この場合「lsof」のフルパスを報告します。
lsof -v

これは “lsof” の詳細なバージョン情報、例えばバイナリの構築日、コンパイラバージョン、コンパイラフラグ、その他をレポートするものである。
Basic “lsof” usage
単独で “lsof” を実行。

コマンド実行時にシステムからアクセス中のすべてのファイルについて BIG リストがレポートされます。
すべてのフィールドは自明ですが、ほとんどの場合、「FD」と「TYPE」カラムとその値について混乱します。
FD: “File Descriptor “の略で、ファイル記述子のことです。 以下のような値が出てきます。
- cwd: カレントワーキングディレクトリ
- rtd: ルートディレクトリ
- txt: プログラムテキスト(データ、コード、その他)
- mem: メモリマップファイル
- err: FD情報エラー
- mmap: メモリマップドデバイス
- ltx: 共有ライブラリテキスト(データおよびコード)
- m86: DOS Merge マップされたファイル
この列には、他にも「1u」のように、u、r、w などの値が続いていることにお気づきでしょう。 それらは何を意味するのでしょうか。
- r: 読み取りアクセス
- w: 書き込みアクセス
- u: Read and Write access
- – : モードが不明でロック文字がある
- ‘ ‘: モードが不明でロック文字がない
TYPE: ファイルの種類とその識別を記述する。 値は以下の通りです。
- DIR: ディレクトリ
- CHR: 文字専用ファイル
- REG: 通常ファイル
- FIFO.FIFO.FIFO
- CHR: 文字専用ファイル
- REG: 文字専用ファイル
- DIR: 文字専用ファイル
User-specific opened files
Linux は素晴らしいマルチユーザープラットフォームである。 複数のユーザーが同時にシステムにアクセスし、権限を持っている操作を実行できます。
あるユーザーがアクセスしているファイルを確認するには、次のコマンドを実行します。

ただし、上位のユーザをチェックアウトするには、「lsof」は「スーパーユーザー」権限を必要とします。

あるユーザーがアクセスしているコマンドやファイルをすべてチェックしてはどうでしょうか? 次のものを実行してください。

繰り返しますが、上位のユーザーに対しては「lsof」は「スーパーユーザー」特権が必要です。

Port-specific running processes
あるポートに現在使用しているすべてのプロセスを見つけるには、”-i” フラグの後にプロトコルおよびポート情報を指定して “lsof” と呼び出すと良い。
:<service|port>
例えばTCP/IPプロトコル上でポート80にアクセス中のすべてのプログラムを調べるには次のコマンドを実行します。

この方法は、ある範囲、例えば1~1000でポートを使っているプロセスをすべて表示することも可能です。 8452>

Protocol-specific processes
IPv4 と IPv6 を現在使用中のプロセスを示す例を 2 つ挙げてみましょう。


ネットワーク接続をリストする
次のコマンドは現在のシステムからのすべてのネットワーク接続を報告します。

^ で除外する
そう、特定のユーザー、ポート、FD などを “^” 文字で除外できるんだ。 8452>
この例では、ユーザー「root」からのすべてのプロセスを除外することにします。

lsof でこの除外メカニズムを使う方法は他にもあり、例えば “-c” や “-d” などといったフラグがあります。 すべてのフラグがこのメカニズムをサポートしているわけではありません。
PID search
PID は、システム上で実行中のあらゆるプロセスの重要なプロパティである。 これにより、特定のプロセスへのより細かいピンポイント検索が可能となる。 同じバイナリがそれ自身のコピーを作成し、異なるタスクを並行して実行できるため、多くの状況でプロセス名はあまり役に立ちません。
プロセスの PID を取得する方法がわからない場合、単に “ps” を使用して実行中のすべてのプロセスをリストし、プロセス名やコマンドを使用して “grep” で出力をフィルタリングしてください。

ここでそのPIDがどんなファイルにアクセスしているかを確認します。
Listing open files for a specific device
「lsof」の機能はこれだけにとどまりません。 lsof」の結果をデバイス単位でフィルタリングすることも可能です。 8452>

このコマンドは特定のファイルシステムにアクセスしているすべてのプロセスとそのオーナー情報を調べるために超便利です。
List opened files under a directory
前の例と同様、ディレクトリパスを “lsof” に渡すだけで、プロセスがアクセス中かどうかを調べることができます。
注意: “lsof” はディレクトリを再帰的にチェックするので、時間がかかることがあります。

Bonus: terminate all user activity
この部分は非常に慎重にしてください、単にユーザがしているすべてのことに混乱する可能性があるからです。 次のコマンドは、ユーザーの実行中のプロセスをすべて終了します。
Final thoughts
「lsof」の機能はここにとどまりません。 ここに挙げたものは、私たちが日常的に最も必要とするものです。 8452>
利用可能なすべての機能とその使用法については、「lsof」のマニュアルと情報ページをチェックしてみてください。



Enjoy!
」となります。