lsofコマンド

開いているファイルとそれを開いたプロセスを一覧表示します。

概要

lsof(list open filesの略)は、システム上で実行中のプロセスによって現在開かれているファイルに関する情報を表示します。特定のファイルを開いているプロセス、特定のプロセスが開いているファイル、ネットワーク接続などを表示できます。このコマンドは、システムのトラブルシューティング、セキュリティ監視、システムリソースの使用状況の理解に非常に役立ちます。

オプション

-p PID

指定したプロセスIDによって開かれたすべてのファイルを一覧表示します。

$ lsof -p 1234
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash     1234   user  cwd    DIR    8,1     4096 123456 /home/user
bash     1234   user  txt    REG    8,1   940336 789012 /usr/bin/bash

-i

インターネット接続(ネットワークファイル)に関連するファイルを一覧表示します。

$ lsof -i
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chrome   1234   user   52u  IPv4  12345      0t0  TCP localhost:49152->localhost:http (ESTABLISHED)
sshd     5678   root    3u  IPv4  23456      0t0  TCP *:ssh (LISTEN)

-i:[port]

指定したポートに関連するファイルを一覧表示します。

$ lsof -i:22
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    1234 root    3u  IPv4  12345      0t0  TCP *:ssh (LISTEN)

-u username

特定のユーザーによって開かれたファイルを一覧表示します。

$ lsof -u john
COMMAND  PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
bash    1234   john  cwd    DIR    8,1     4096 123456 /home/john
chrome  2345   john   10r   REG    8,1    12345 234567 /home/john/Downloads/file.pdf

-c command

指定したコマンド名を持つプロセスによって開かれたファイルを一覧表示します。

$ lsof -c chrome
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
chrome   1234   user  cwd    DIR    8,1     4096 123456 /home/user
chrome   1234   user  txt    REG    8,1 12345678 234567 /opt/google/chrome/chrome

-t

プロセスIDのみを表示します。スクリプト作成に便利です。

$ lsof -t -i:80
1234
5678

+D directory

指定したディレクトリとそのサブディレクトリ内のすべての開いているファイルを一覧表示します。

$ lsof +D /var/log
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 123 root    5w   REG    8,1    12345 123456 /var/log/syslog
nginx   1234 www     3w   REG    8,1     5678 234567 /var/log/nginx/access.log

使用例

特定のファイルを使用しているプロセスを見つける

$ lsof /var/log/syslog
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
rsyslogd 123 root    5w   REG    8,1    12345 123456 /var/log/syslog

特定のポートをリッスンしているプロセスを見つける

$ lsof -i TCP:80
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx   1234 root    6u  IPv4  12345      0t0  TCP *:http (LISTEN)

複数のオプションを組み合わせる

$ lsof -u john -c chrome -i TCP
COMMAND  PID  USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
chrome  1234  john   52u  IPv4  12345      0t0  TCP localhost:49152->server:https (ESTABLISHED)
chrome  1234  john   60u  IPv4  23456      0t0  TCP localhost:49153->cdn:https (ESTABLISHED)

ヒント

削除されたファイルを使用しているプロセスを見つける

プロセスが削除されたファイルを開いている場合、lsof | grep deletedで見つけることができます。これは、削除されたファイルを保持しているプロセスを再起動してディスク容量を解放するのに役立ちます。

ネットワーク接続の監視

lsof -i -P -nを使用して、数値ポートとIPアドレスを持つすべてのネットワーク接続を表示します。-Pはポート番号からサービス名への変換を防ぎ、-nはホスト名の検索を防ぎます。

メモリマップされたファイルを見つける

lsof -a -p PID -d memを使用して、特定のプロセスのメモリマップされたファイルを確認します。これはメモリ使用パターンを理解するのに役立ちます。

継続的な監視

lsof -r 2を使用して、2秒ごとに一覧を繰り返し表示します。これは変化するファイル使用パターンを監視するのに役立ちます。

よくある質問

Q1. 特定のポートを使用しているプロセスを見つけるにはどうすればよいですか?

A. lsof -i:ポート番号を使用します(例:HTTPポートの場合はlsof -i:80)。

Q2. すべてのネットワーク接続を確認するにはどうすればよいですか?

A. すべてのネットワーク接続を見るにはlsof -iを使用するか、TCPのみの接続を見るにはlsof -i TCPを使用します。

Q3. 特定のユーザーによって開かれたすべてのファイルを見つけるにはどうすればよいですか?

A. lsof -u ユーザー名を使用して、特定のユーザーによって開かれたすべてのファイルを一覧表示します。

Q4. 特定のディレクトリにアクセスしているプロセスを見つけるにはどうすればよいですか?

A. lsof +D /path/to/directoryを使用して、そのディレクトリ内のファイルにアクセスしているすべてのプロセスを一覧表示します。

Q5. 特定のファイルを使用しているプロセスを見つけるにはどうすればよいですか?

A. 単にlsof /path/to/fileを実行して、そのファイルを開いているプロセスを確認します。

macOSに関する考慮事項

macOSでは、lsofの動作がLinuxバージョンと若干異なる場合があります:

参考文献

https://www.freebsd.org/cgi/man.cgi?query=lsof

改訂履歴