Linux lsof コマンド
中でも強力なコマンドラインツールで、現在のシステムで開かれているすべてのファイルと関連するプロセス情報を一覧表示します。Linuxでは「すべてはファイル」という理念があるため、lsof は通常のファイルだけでなく、ネットワーク接続、デバイスファイル、パイプ、ソケットなども表示できます。
lsof 基本構文
lsof [选项] [文件名或目录]
よく使うオプションとパラメータの説明
| オプション | 説明 |
|---|---|
-a |
AND ロジックを使用して複数の条件を組み合わせる |
-c <进程名> |
指定したプロセスが開いているファイルを表示 |
-d <文件描述符> |
指定したファイルディスクリプタのファイルを表示 |
-i |
ネットワーク接続に関する情報を表示 |
-n |
ホスト名を解決しない(IP アドレスを表示) |
-P |
ポート名を解決しない(ポート番号を表示) |
-p <PID> |
指定したプロセス ID が開いているファイルを表示 |
-u <用户名> |
指定したユーザーが開いているファイルを表示 |
+D <目录> |
ディレクトリ内で開かれているファイルを再帰的に表示 |
-t |
プロセス ID のみを出力(スクリプトでの使用に適しています) |
よく使う操作例
1. 開かれているすべてのファイルを表示
lsof
これにより、システム内で開かれているすべてのファイル(通常のファイル、ディレクトリ、ライブラリファイル、デバイス、ネットワーク接続など)が一覧表示されます。
2. 指定したプロセスが開いているファイルを表示
例
lsof -c nginx # すべての nginx プロセスが開いているファイルを表示
3. ネットワーク接続を表示
例
lsof -i :80 # ポート 80 を使用するすべての接続を表示
lsof -i TCP # すべての TCP 接続を表示
4. ユーザーが開いているファイルを表示
lsof -u root # 查看 root 用户打开的文件
5. 削除されたがプロセスにまだ使用されているファイルを検索
lsof | grep deleted
これは、ログファイルが削除されたがサービスがまだ実行されている場合によく見られ、ディスク容量が解放されない原因となります。
6. 指定したディレクトリ内で開かれているファイルを表示
lsof +D /var/log # 查看 /var/log 目录下被打开的文件
出力フィールドの解説
lsof コマンドの出力に表示される代表的な列は次のとおりです:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
- COMMAND:プロセス名
- PID:プロセス ID
- USER:プロセスを実行しているユーザー
- FD:ファイルディスクリプタ
cwd:現在の作業ディレクトリtxt:プログラムコードファイルmem:メモリマップファイル0u、1u、2u:標準入力、標準出力、標準エラー
- TYPE:ファイルタイプ(REG 通常ファイル、DIR ディレクトリ、CHR キャラクタデバイスなど)
- DEVICE:デバイス番号
- SIZE/OFF:ファイルサイズまたはオフセット
- NODE:ファイルの inode 番号
- NAME:ファイル名またはマウントポイント
高度な使用例
1. ポートを占有しているプロセスを検索
lsof -i :8080
サービスを起動したいがポートがすでに占有されている場合、このコマンドでポートを占有しているプロセスをすばやく見つけることができます。
2. 削除されたファイルを復元
ファイルが削除されたがプロセスがまだ使用している場合、/proc ファイルシステムを通じて復元できます:
例
ls -l /proc//fd # プロセスのファイルディスクリプタを表示
cp /proc//fd/ /path/to/recovery # ファイルを復元
3. ファイルアクセスの監視
watch -n 1 'lsof /path/to/file'
これにより、特定のファイルがどのプロセスによってアクセスされているかをリアルタイムで監視できます。
よくある問題の解決
1. ディスク容量が不足しているが大きなファイルが見つからない
lsof | grep deleted
削除されたがプロセスにまだ使用されているファイルを探し、関連するプロセスを再起動して容量を解放します。
2. デバイスをアンマウントできない
lsof /mount/point
マウントポイントを使用しているプロセスを特定し、それらのプロセスを終了してからアンマウントします。
3. ネットワーク接続の問題を調査
lsof -i -n -P
すべてのネットワーク接続を表示し、ポートの競合や接続の問題の調査に役立てます。
パフォーマンスに関する考慮事項
lsof は強力な機能を持っていますが、負荷の高い本番環境で使用する際には注意が必要です:
- 直接実行すると
lsofシステム全体をスキャンするため、多くのリソースを消費する可能性があります - できるだけ正確なフィルタ条件を使用してください(例:
-p、-u、-iなど)でクエリ範囲を絞り込みます - スクリプトでは
-tオプションを使用して PID のみを出力し、解析のオーバーヘッドを削減します
代替ツール
lsof は最もよく使われるツールですが、特定のシナリオでは次のものを検討できます:
- fuser:特定のファイルやソケットをどのプロセスが使用しているかをすばやく確認
- ss/netstat:ネットワーク接続情報に特化
- ps:組み合わせて
/procファイルシステムからも部分的な情報を取得できます
まとめ
lsof は Linux システム管理者と開発者にとってのスイスアーミーナイフです。使いこなすことで以下のことが可能になります:
- リソース占有の問題をすばやく特定
- ファイルやネットワーク関連の問題を調査
- システムの稼働状態を把握
- さまざまな「ファイルが占有されている」問題を解決
日頃の作業で多く練習し、具体的なシナリオに応じてさまざまなオプションやパラメータを柔軟に活用しながら、この強力なツールのすべての可能性を徐々に習得することをお勧めします。
その他の拡張