理系学生日記

おまえはいつまで学生気分なのか

lsof の使い方

lsof は,なんかのプロセスによって開かれているリソースを一覧できるコマンドです.lsof なんてへんな名前ですけど,LiSt Open Files の略みたいですね.

**ファイルを開いているプロセス

ファイル名を指定してやると,そのファイルを開いているプロセスとかが分かります.

|tcsh|

lsof /home/y-kiri | head -4

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sh 13419 y-kiri cwd DIR 253,0 4096 9232386 /home/y-kiri Xsession 13527 y-kiri cwd DIR 253,0 4096 9232386 /home/y-kiri imsetting 13529 y-kiri cwd DIR 253,0 4096 9232386 /home/y-kiri ||<

**表示変えたい

PID だけ調べれば良いし!! ってときは,cut とか awk とか使うのも良いですけど,terse を意味する -t を付けると幸せになれる.

|tcsh|

lsof -t /home/y-kiri | head -4

13419 13527 13529 13574 ||<

もっと表示のフォーマットを変えたいときは,-F オプションを使います.-F の後に出力したい項目を表す文字をリストとして指定します.例えばこれは,プロセスの名前(c)とそのプロセスのログイン名(L)を表示してます.

|tcsh|

lsof -FcL /home/y-kiri | head -6

p13419 csh Ly-kiri p13527 cXsession Ly-kiri ||< PID は必ず表示されます.それと行の先頭にはその行が表す項目の文字が出力されます.

各項目の区切り文字を NULL にすることも可能.

|tcsh|

lsof -FcL0 /home/y-kiri | head -3

p13419cshLy-kiri p13527cXsessionLy-kiri p13529cimsettings-ximLy-kiri ||<

**ユーザ指定

特定のユーザが開いているファイルとかは,-u オプションで指定できます.ぼくが開いているファイルはこんな感じ.

|tcsh|

lsof -uy-kiri | head -5

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME gnome-key 13418 y-kiri cwd DIR 253,0 4096 7890019 /var/gdm gnome-key 13418 y-kiri rtd DIR 253,0 4096 2 / gnome-key 13418 y-kiri txt REG 253,0 378628 11631460 /usr/bin/gnome-keyring-daemon.#prelink#.dh2zHw (deleted) gnome-key 13418 y-kiri mem REG 253,0 54828 721016 /lib/libnss_files-2.8.so ||< ちなみに,'^' は nagate になったりするので,root 以外が開いているファイルはこんな感じで指定できる.'^' は他のオプションにもガンガン使えます. |tcsh|

lsof -uroot | head -5

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME rpcbind 1707 rpc cwd DIR 253,0 4096 2 / rpcbind 1707 rpc rtd DIR 253,0 4096 2 / rpcbind 1707 rpc txt REG 253,0 51596 19210387 /sbin/rpcbind rpcbind 1707 rpc mem REG 253,0 137348 721047 /lib/ld-2.8.so ||<

**プロセス指定

このプロセスどのファイルを開いてるんだろう,みたいなときは -p.crond だとこんな感じ.

|tcsh|

lsof -p pgrep crond

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME crond 2077 root cwd DIR 253,0 4096 7889794 /var/spool crond 2077 root rtd DIR 253,0 4096 2 / crond 2077 root txt REG 253,0 315692 11626599 /usr/sbin/crond crond 2077 root mem REG 253,0 54828 721016 /lib/libnss_files-2.8.so ||<

**ネットワーク関係

ネットワークどうのこうのというときは,-i オプションを使います.単に -i だけだと Listen してるプロセスとかが一覧できます.

|tcsh|

lsof -i | head

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME rpcbind 1707 rpc 6u IPv4 3892 UDP :sunrpc rpcbind 1707 rpc 7u IPv4 3896 UDP :npmp-local rpcbind 1707 rpc 8u IPv4 3897 TCP :sunrpc (LISTEN) rpc.statd 1726 rpcuser 6u IPv4 3999 UDP :659 rpc.statd 1726 rpcuser 8u IPv4 4017 UDP :43529 rpc.statd 1726 rpcuser 9u IPv4 4044 TCP :43484 (LISTEN) xinetd 2024 root 5u IPv6 5135 TCP :telnet (LISTEN) avahi-dae 2107 avahi 14u IPv4 5502 UDP :mdns ||< TCP と UDP が混ざってんの汚いよなーとか思うときは,grep せずとも -i に引数を渡してやる. |tcsh|

lsof -iTCP | head

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME rpcbind 1707 rpc 8u IPv4 3897 TCP :sunrpc (LISTEN) rpc.statd 1726 rpcuser 9u IPv4 4044 TCP :43484 (LISTEN) xinetd 2024 root 5u IPv6 5135 TCP :telnet (LISTEN) sshd 6470 root 3u IPv4 38887 TCP :ssh (LISTEN) sshd 6470 root 4u IPv6 38889 TCP :ssh (LISTEN) httpd 19609 root 4u IPv6 1865857 TCP :http (LISTEN) sshd 20296 root 3r IPv4 2829510 TCP 192.168.1.3:ssh->192.168.1.1:49893 (ESTABLISHED) sshd 20299 y-kiri 3u IPv4 2829510 TCP 192.168.1.3:ssh->192.168.1.1:49893 (ESTABLISHED) ||< /etc/services 記載のプロトコルなら名前で指定できるし,記載されてなくてもポート番号を指定すれば良いです.このあたりの指定には ':' を使います.http のポートは,httpd が使ってるよーという図. |tcsh|

lsof -i:http | head -3

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME httpd 19609 root 4u IPv6 1865857 TCP :http (LISTEN) httpd 20471 apache 4u IPv6 1865857 TCP :http (LISTEN) ||< これで httpd が起動しないときに,なんか他のプロセスが 80 番使ってんじゃね?みたいなことを調べるのも楽チンになりますね!

**オプションの組合せかた

オプションはデフォルトでは OR 指定と見なされます.たとえば以下のは,「/home/y-kiri を開いている PID 13419 のプロセス」ではなく,「/home/y-kiri を開いているプロセス または PID 13419 のプロセスが開いているファイル」という感じですね.

|tcsh|

lsof -p 13419 /home/y-kiri | head -3

||< AND 条件にしたいときは -a を付けます.-a を付けると,指定したオプションが AND で結合されます. |tcsh|

lsof -a -p 13419 /home/y-kiri

COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME sh 13419 y-kiri cwd DIR 253,0 4096 9232386 /home/y-kiri ||<

**参考

-@IT:特定のポートをオープンしているプロセスを調べるには -lsofの使い方 - プロセスが使用中のファイルを調べる - うまいぼうぶろぐ -2007-12-08