lsofコマンドはシステム上の開いているファイルと、それらのファイルにアクセスしているプロセスを表示します。
ファイルには、通常のファイル、ディレクトリ、ネットワークソケット、デバイスファイルなどが含まれているため、ポートの利用状況の確認等にも利用でき、ファイルシステムのトラブルシューティングやセキュリティ監査に役立つツールになります。
lsofは、List Open Filesの略になります。
目次
開いているファイルをすべて表示(オプションなし)
システム上で開いているファイルをすべて表示できます。システム上で開いているファイルをすべて表示するととても多くのファイルが表示されるため、lsofコマンドは基本的にオプションを利用して表示する内容をフィルタリングして使うことになると思います。
コマンド例
1 |
lsof |
実行結果
1 2 3 4 5 6 7 |
$ lsof | head -n 6 COMMAND PID TID TASKCMD USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 1 root cwd unknown /proc/1/cwd (readlink: Permission denied) systemd 1 root rtd unknown /proc/1/root (readlink: Permission denied) systemd 1 root txt unknown /proc/1/exe (readlink: Permission denied) systemd 1 root NOFD /proc/1/fd (opendir: Permission denied) kthreadd 2 root cwd unknown /proc/2/cwd (readlink: Permission denied) |
補足として、利用環境によりますが、lsofコマンドの出力の行数を確認してみると
1 2 |
$ lsof | wc -l 39226 |
約40000行程のレコードが表示されるのが確認できます。
特定のユーザーが開いているファイルを表示(-u <ユーザー名>)
-uオプションを用いると特定のユーザーが開いているファイルを表示できます。
コマンド例
1 |
lsof -u <ユーザー名> |
実行結果
1 2 3 4 5 6 |
$ lsof -u ubuntu | head -n 5 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME systemd 3283 ubuntu cwd unknown /proc/3283/cwd (readlink: Permission denied) systemd 3283 ubuntu rtd unknown /proc/3283/root (readlink: Permission denied) systemd 3283 ubuntu txt unknown /proc/3283/exe (readlink: Permission denied) systemd 3283 ubuntu 0 unknown /proc/3283/fd/0 (readlink: Permission denied) |
指定したプロセスが開いているファイルを表示(-p <プロセスID>)
-pオプションを用いると指定したプロセスが開いているファイルを表示できます。
例ではviエディタを指定しています。表示されているファイルはviで利用している共有ライブラリや設定ファイル、viコマンドで新規に開いたファイルを編集するために作成されたスワップファイル、エディタの編集状況を表示するために開かれた仮想端末のデバイスファイルなどが確認できます。
コマンド例
1 |
lsof -p <プロセスID> |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
$ ps PID TTY TIME CMD 4159 pts/1 00:00:00 bash 4256 pts/1 00:00:00 vi 4278 pts/1 00:00:00 ps $ lsof -p 4256 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME vi 4256 ubuntu cwd DIR 8,2 4096 20709378 /home/ubuntu vi 4256 ubuntu rtd DIR 8,2 4096 2 / vi 4256 ubuntu txt REG 8,2 4126400 1841301 /usr/bin/vim.basic vi 4256 ubuntu mem REG 8,2 2125328 1837484 /usr/lib/x86_64-linux-gnu/libc.so.6 vi 4256 ubuntu mem REG 8,2 324452 2383951 /usr/share/locale-langpack/ja/LC_MESSAGES/vim.mo vi 4256 ubuntu mem REG 8,2 1183008 1837691 /usr/lib/locale/locale-archive vi 4256 ubuntu mem REG 8,2 9042824 1844354 /usr/lib/x86_64-linux-gnu/libpython3.12.so.1.0 vi 4256 ubuntu mem REG 8,2 324371 2387731 /usr/share/vim/vim91/lang/ja/LC_MESSAGES/vim.mo vi 4256 ubuntu mem REG 8,2 170240 1846449 /usr/lib/x86_64-linux-gnu/libexpat.so.1.9.1 vi 4256 ubuntu mem REG 8,2 113000 1847007 /usr/lib/x86_64-linux-gnu/libz.so.1.3 vi 4256 ubuntu mem REG 8,2 625344 1846770 /usr/lib/x86_64-linux-gnu/libpcre2-8.so.0.11.2 vi 4256 ubuntu mem REG 8,2 26688 1846532 /usr/lib/x86_64-linux-gnu/libgpm.so.2 vi 4256 ubuntu mem REG 8,2 38984 1846291 /usr/lib/x86_64-linux-gnu/libacl.so.1.1.2302 vi 4256 ubuntu mem REG 8,2 355040 1836634 /usr/lib/x86_64-linux-gnu/libsodium.so.23.3.0 vi 4256 ubuntu mem REG 8,2 174472 1846841 /usr/lib/x86_64-linux-gnu/libselinux.so.1 vi 4256 ubuntu mem REG 8,2 208328 1846897 /usr/lib/x86_64-linux-gnu/libtinfo.so.6.4 vi 4256 ubuntu mem REG 8,2 952616 1837487 /usr/lib/x86_64-linux-gnu/libm.so.6 vi 4256 ubuntu mem REG 8,2 27028 1837473 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache vi 4256 ubuntu mem REG 8,2 236616 1837481 /usr/lib/x86_64-linux-gnu/ld-linux-x86-64.so.2 vi 4256 ubuntu 0u CHR 136,1 0t0 4 /dev/pts/1 vi 4256 ubuntu 1u CHR 136,1 0t0 4 /dev/pts/1 vi 4256 ubuntu 2u CHR 136,1 0t0 4 /dev/pts/1 vi 4256 ubuntu 3u REG 8,2 12288 20709599 /home/ubuntu/.testfile.swp |
指定したポートを使用しているネットワークソケットを表示(-i :<ポート番号>)
-iオプションを用いると指定したポートを使用しているネットワークソケットを表示できます。
1 2 3 |
$ lsof -i :8000 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python3 5005 ubuntu 3u IPv4 48594 0t0 TCP *:8000 (LISTEN) |
-iオプションでの指定する文字列の書式は以下のようになっています。
1 |
[46][proto][@host|addr][:svc_list|port_list] |
指定したプロトコル(TCPやUDPなど)に関連するネットワークソケットを表示(-i <tcp, udp等>)
-iオプションは書式を変えることで、指定したプロトコルに関連するネットワークソケットを表示できます。
1 2 3 4 |
$ lsof -i tcp COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME python3 5005 ubuntu 3u IPv4 48594 0t0 TCP *:8000 (LISTEN) python3 5012 ubuntu 3u IPv4 48703 0t0 TCP localhost:http-alt (LISTEN) |
上記の例は、HTTPサーバーを以下のコマンドを実行して起動させています。
1 |
$ python3 -m http.server 8000 & |
1 |
$ python3 -m http.server --bind 127.0.0.1 8080 & |
lsofの出力を編集
簡単なテキスト編集の紹介になります。AwkとRubyを利用して、AwkはGNU Awkになります。
・列の抽出(Awk, 1行目飛ばし)
コマンド例
1 |
awk 'NR>=2 {print $2}' |
実行結果
1 2 3 |
$ lsof -i tcp | awk 'NR>=2 {print $2}' 4237 4238 |
・列の抽出(Ruby, 1行目飛ばし)
コマンド例
1 |
ruby -alne 'puts $F[1] if $.>=2' |
実行結果
1 2 3 |
$ lsof -i tcp | ruby -alne 'puts $F[1] if $.>=2' 4237 4238 |
・横並び(Awk)
コマンド例
1 |
awk 'NR>=2 {if(NR==2) str=$2;else str=str","$2} END {print str}' |
実行結果
1 2 |
$ lsof -i tcp | awk 'NR>=2 {if(NR==2) str=$2;else str=str","$2} END {print str}' 4237,4238 |
・横並び(Ruby)
コマンド例
1 |
ruby -alne 'BEGIN{l=[]}; l<<$F[1] if $.>=2; END{puts l.join(",")}' |
実行結果
1 2 |
$ lsof -i tcp | ruby -alne 'BEGIN{l=[]}; l<<$F[1] if $.>=2; END{puts l.join(",")}' 4237,4238 |