lsof は、プロセスが開いている「ファイル」を一覧表示するコマンドです。ここでのファイルには通常のファイルだけでなく、ディレクトリ、デバイス、UNIXドメインソケット、TCP/UDPソケットなども含まれます。
「ポートを使用中のプロセスを知りたい」「アンマウントできない理由(開かれたファイル)を突き止めたい」といった実務でよく使われます。 (man7.org)
構文(Syntax)
lsof [OPTIONS] [--] [NAME...]
ネットワーク選択子の基本形:
lsof -i [46][PROTOCOL][@HOST][:SERVICE|PORT[-PORT]]
# 例: -iTCP:22, -i4@127.0.0.1, -iUDP:@host:53, -i TCP:@[2001:db8::1]:443
ディレクトリ配下の検索:
lsof +d DIR # DIR 直下のみ
lsof +D DIR # DIR を再帰的に(深く)探索
繰り返し表示(監視):
lsof -r[SECONDS] # 例: -r2 で 2 秒毎に繰り返し
※ 書式や各選択子は lsof(8) の記述に準拠しています。 (man7.org)
主なオプション一覧
| オプション | 説明 | 使用例 |
|---|---|---|
-i [SEL] | ネットワーク(TCP/UDP 等)のみを表示。[46][PROTO][@HOST][:PORT] 形式で絞り込み可能。 | lsof -iTCP:22 / lsof -i4@127.0.0.1 (man7.org) |
-s[p:s] | -i と併用し、TCP/UDP の状態で絞り込み。 | lsof -iTCP -sTCP:LISTEN(LISTEN のみ) (man7.org) |
-P | ポート番号→サービス名への変換を抑止して高速化(番号で表示)。 | lsof -i -P (man7.org) |
-n | ホスト名解決(DNS 逆引き)を抑止して高速化。 | lsof -i -n(-P と併用が定番) (ウィキペディア) |
-p PID[,PID...] | 指定 PID のみ表示(カンマ区切りで複数可)。 | lsof -p 1234,5678 (man7.org) |
-u USER[,USER...] | 指定ユーザーのプロセスに限定。否定は ^USER。 | lsof -u alice / lsof -u ^root (man7.org) |
-t | 見出しなしで PID のみ出力(スクリプト向け)。 | lsof -t -iTCP:3000 (man7.org) |
+d DIR | DIR 直下で開かれている項目のみ検索。 | lsof +d /var/log (man7.org) |
+D DIR | DIR を再帰的に探索(大きなツリーは時間・メモリ消費)。 | sudo lsof +D /mnt/usb (man7.org) |
-c CMD | コマンド名(前方一致/正規表現)で絞り込み。 | lsof -c ssh / lsof -c '/^nginx$/' (man7.org) |
-a | 複数の選択条件を AND 結合にする。 | lsof -a -u alice -iTCP (man7.org) |
-U | UNIX ドメインソケットに限定。 | lsof -U (man7.org) |
-r[SECS] | 繰り返し表示(デフォルト 15 秒)。 | lsof -r2 -iTCP:22 (Debian Manpages) |
-F [f] | 機械可読なフィールド出力(スクリプト処理向け)。 | lsof -Fpcfn (man7.org) |
実行例
ポート 3000 を LISTEN しているプロセスを番号で確認(名前解決なし)
sudo lsof -iTCP:3000 -sTCP:LISTEN -P -n
出力例:
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
node 12345 dev 23u IPv4 ... 0t0 TCP *:3000 (LISTEN)
(-P -n で表示高速化と“番号表示”に) (man7.org)
特定の PID のみ
lsof -p 1234,5678
複数 PID をカンマ区切りで指定可能。 (man7.org)
ディレクトリ配下で開かれているファイルを調べる(直下のみ)
lsof +d /var/log
(配下の開放漏れやローテート確認に)
ディレクトリを再帰的に探索(重い処理に注意)
sudo lsof +D /var/www
大規模ツリーでは時間・メモリ消費が大きくなるため、必要時のみ使用。 (man7.org)
エラー例:存在しない PID を指定
lsof -p 999999
出力例(環境により文言は異なる):
lsof: no such process 999999
関連コマンド
fuser:指定ファイルやマウントポイントを使用しているプロセスを表示。アンマウント障害の切り分けに。ss/netstat:ネットワークソケットの一覧(プロセス対応は環境次第)。lsfd:Linux 向けのlsof後継(util-linux に同梱)。高速で/procに特化。 (ウィキペディア)
備考
- 環境差分:
lsofは多くの UNIX 系で利用可能ですが、出力の列やサポート状況(例:IPv6、TCP/TPI 詳細など)は OS により多少異なります。 (man7.org) - 権限:通常ユーザーでは他ユーザーのプロセスが見えないことがあります。必要に応じて
sudoを使用してください。 (Super User) - 逆引き・サービス名変換:名前解決で遅くなる場合、
-n -Pを併用すると高速化できます。ポート名の変換は/etc/servicesに基づきます。 (man7.org) - ディレクトリ探索:
+Dは全階層をstat(2)しながら照合するため非常に重い場合があります。大きいツリーでは注意。 (man7.org) - スクリプト連携:監視では
-rと-Fを併用し、awk/jq等で処理するのが定番です。 (Debian Manpages)
参考
- lsof(8) — Linux manual page(man7.org) (man7.org)
- Debian manpages: lsof(8)(オプション詳細) (Debian Manpages)
- Wikipedia: Lsof(概要と
-n -Pの使い方例 /lsfdへの言及) (ウィキペディア)

コメント