lsof(List Open Files)は、システム上で現在開かれているファイルの一覧を表示するコマンドです。
Linuxでは「すべてはファイルである」という設計思想のもと、通常のファイルだけでなく、ネットワークソケット・デバイス・パイプなども「ファイル」として扱われます。
lsof はこれらすべてを調べられるため、トラブルシューティングや診断に欠かせないツールです。
基本構文
lsof [オプション] [対象]
オプションなしで実行すると、全プロセスが開いている全ファイルを出力します(非常に大量になるため、通常は絞り込みオプションと組み合わせます)。
ステップ1:出力の読み方
まず基本的な出力を見てみましょう。
lsof | head -5
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd 1 root cwd DIR 8,1 4096 2 /
systemd 1 root rtd DIR 8,1 4096 2 /
systemd 1 root txt REG 8,1 1629360 123 /lib/systemd/systemd
bash 512 user mem REG 8,1 1849064 456 /lib/x86_64-linux-gnu/libc.so.6
各列の意味は次のとおりです。
| 列 | 説明 |
|---|---|
| COMMAND | コマンド名 |
| PID | プロセスID |
| USER | 実行ユーザー |
| FD | ファイルディスクリプタ(cwd=カレントディレクトリ, txt=実行ファイル, mem=メモリマップ, 数字=FD番号) |
| TYPE | ファイル種別(REG=通常ファイル, DIR=ディレクトリ, IPv4/IPv6=ソケット など) |
| NAME | ファイルパスまたはアドレス |
ステップ2:特定のファイルを開いているプロセスを調べる
lsof /var/log/syslog
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
rsyslogd 789 root 4w REG 8,1 204800 98765 /var/log/syslog
「このファイルは誰が使っているか?」を確認するのに便利です。 ファイルが削除できない・アンマウントできないときに特に役立ちます。
ステップ3:特定のポートを使用しているプロセスを調べる
-i オプションでネットワーク接続を絞り込めます。
# ポート番号で絞り込む
lsof -i :80
# プロトコルとポートで絞り込む
lsof -i tcp:22
# 特定のホストへの接続を調べる
lsof -i @192.168.1.1
例:ポート8080を使っているプロセスを確認する
lsof -i :8080
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 1234 user 23u IPv4 56789 0t0 TCP *:8080 (LISTEN)
「このポートはすでに使われている」というエラーが出たときに有効です。
ステップ4:特定のプロセスが開いているファイルを調べる
-p オプションでPIDを指定します。
# PIDが1234のプロセスの開いているファイルを表示
lsof -p 1234
# コマンド名で絞り込む(-c オプション)
lsof -c nginx
# 特定ユーザーのプロセスを調べる
lsof -u username
ステップ5:ネットワーク接続の一覧を確認する
# すべてのネットワーク接続を表示
lsof -i
# TCP接続のみ表示
lsof -i tcp
# LISTEN状態のポートのみ表示
lsof -i -sTCP:LISTEN
ss コマンドや netstat の代わりとして使えます。
ステップ6:削除済みファイルを開いているプロセスを探す
ファイルを削除してもプロセスが開き続けると、ディスク容量が解放されません。 そのようなプロセスは以下で見つけられます。
lsof | grep deleted
java 5678 user 10u REG 8,1 2097152 99999 /tmp/app.log (deleted)
このような場合、該当プロセスを再起動するとディスク容量が解放されます。
よく使うオプションまとめ
| オプション | 説明 |
|---|---|
-i :ポート番号 | 指定ポートを使うプロセスを表示 |
-i tcp / -i udp | TCP/UDP接続を表示 |
-p PID | 指定PIDのプロセスを表示 |
-c コマンド名 | コマンド名で絞り込み |
-u ユーザー名 | 指定ユーザーのプロセスを表示 |
-n | ホスト名をIPアドレスで表示(高速化) |
-P | ポートを番号で表示(サービス名に変換しない) |
+D ディレクトリ | ディレクトリ以下のファイルを開いているプロセスを表示 |
練習問題
以下の問題を実際にコマンドを打って試してみましょう。
問題1
ポート 22(SSH)を開いているプロセスを確認するコマンドを書いてください。
問題2
/etc/passwd ファイルを現在開いているプロセスを調べるコマンドを書いてください。
問題3
現在リッスン(待ち受け)状態にあるTCPポートをすべて表示するコマンドを書いてください。
問題4
自分のユーザー名(例:user)が開いているネットワーク接続を確認するコマンドを書いてください。
答え
問題1
lsof -i :22
または -n -P を追加すると名前解決をスキップして高速に表示できます。
lsof -i :22 -n -P
問題2
lsof /etc/passwd
問題3
lsof -i tcp -sTCP:LISTEN -n -P
問題4
lsof -u user -i
まとめ
lsof は次のような場面で活躍します。
- 「このポートは使用中」エラー →
lsof -i :ポート番号で犯人を特定 - ディスク容量が減らない →
lsof | grep deletedで削除済みファイルを探す - プロセスが何を開いているか確認 →
lsof -p PIDで調査 - 特定ファイルへのアクセスを監視 →
lsof ファイルパスで確認
システム管理・デバッグの現場で非常に役立つコマンドなので、ぜひ身につけておきましょう。