lsof – プロセスが開いているファイル(ソケット含む)を一覧表示する

一覧・詳細

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...]指定ユーザーのプロセスに限定。否定は ^USERlsof -u alice / lsof -u ^root (man7.org)
-t見出しなしで PID のみ出力(スクリプト向け)。lsof -t -iTCP:3000 (man7.org)
+d DIRDIR 直下で開かれている項目のみ検索。lsof +d /var/log (man7.org)
+D DIRDIR を再帰的に探索(大きなツリーは時間・メモリ消費)。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)
-UUNIX ドメインソケットに限定。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)

参考

Bash玄

はじめまして!Bash玄です。

エンジニアとしてシステム運用に携わる中で、手作業の多さに限界を感じ、Bashスクリプトを活用して業務を効率化したのがきっかけで、この道に入りました。「手作業は負け」「スクリプトはシンプルに」をモットーに、誰でも実践できるBashスクリプトの書き方を発信しています。

このサイトでは、Bashの基礎から実践的なスクリプト作成まで、初心者でもわかりやすく解説しています。少しでも「Bashって便利だな」と思ってもらえたら嬉しいです!

# 好きなこと
- シンプルなコードを書くこと
- コマンドラインを快適にカスタマイズすること
- 自動化で時間を生み出すこと

# このサイトを読んでほしい人
- Bashに興味があるけど、何から始めればいいかわからない人
- 定型業務を自動化したい人
- 効率よくターミナルを使いこなしたい人

Bashの世界に一歩踏み出して、一緒に「Bash道」を極めていきましょう!

Bash玄をフォローする

コメント