lsofは指定されたポートを使用しているプロセスを調べるためだけではなかった

普段任意のポートを使用しているプロセスはなんだろうってなった時にlsofを使う

$ lsof -i:80 # port:80を使用しているプロセス
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx     1 root    6u  IPv4 229552      0t0  TCP *:http (LISTEN)

おっport:80はnginxだね。のような感じ
このlsofはポートを調べる時にしか使ってなかったのでそういう用途かと思ったら他にもあったので覚えておくためにも記録しておく

まずはどんなオプションがあるんだっけの時のman lsof
descriptionにはApple DarwinLinux, FreeBSD, SolarisなどのUNIXによって開かれたファイルの情報を出力するということが書いてある
とりあえず見てみる

特定のポートを使用しているプロセスを調べる

これは冒頭でのlsofでの使用例でも出したものです

$ lsof -i:80 # port:80を使用しているプロセス
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
nginx     1 root    6u  IPv4 229552      0t0  TCP *:http (LISTEN)

指定されたファイルを開いているプロセスは何か

例えばrailsのログを指定してみる

$ lsof development.log
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby      1 root    8w   REG   0,73    10899 1958 development.log

$ ps 1
PID TTY      STAT   TIME COMMAND
  1 ?        Ssl    0:03 /usr/local/bin/ruby bin/rails server -b 0.0.0.0

このことからdevelopment.logはrails serverが開いていることが分かった

指定されたプロセスが開いているファイル一覧

さきほどは指定されたファイルからプロセスを指定したが次は特定のプロセスが開いているファイル見る

$ lsof -p 1
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
ruby      1 root  cwd    DIR   0,73     4096     13 /usr/src/app
ruby      1 root  rtd    DIR   0,73     4096      2 /
ruby      1 root  txt    REG   0,73   142408     39 /usr/local/bin/ruby
~~
uby      1 root  mem    REG   0,73    14664     46 /lib/x86_64-linux-gnu/libdl-2.19.so
ruby      1 root  mem    REG   0,73   137384     44 /lib/x86_64-linux-gnu/libpthread-2.19.so
ruby      1 root  mem    REG   0,73 14453344     42 /usr/local/lib/libruby.so.2.3.0
ruby      1 root  mem    REG   0,73   140928     33 /lib/x86_64-linux-gnu/ld-2.19.so
ruby      1 root  mem    REG   0,73    26258   1422 /usr/lib/x86_64-linux-gnu/gconv/gconv-modules.cache
ruby      1 root    0r  FIFO   0,10      0t0 255817 pipe
ruby      1 root    1w  FIFO   0,10      0t0 255818 pipe
ruby      1 root    2w  FIFO   0,10      0t0 255819 pipe
ruby      1 root    3r  FIFO   0,10      0t0 255913 pipe
ruby      1 root    4w  FIFO   0,10      0t0 255913 pipe
ruby      1 root    5r  FIFO   0,10      0t0 255914 pipe
ruby      1 root    6w  FIFO   0,10      0t0 255914 pipe
ruby      1 root    7w   CHR    1,3      0t0 255878 /dev/null
ruby      1 root    8w   REG   0,73    10899   1958 /usr/src/app/log/development.log
ruby      1 root    9u  IPv4 255918      0t0    TCP *:3000 (LISTEN)

log以外にも色々出てきましたね

指定された秒数ごとにlsofコマンドを再実行してくれる

5秒ごとに再実行される
$ lsof -i:3000 -r5
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby      1 root    9u  IPv4 255918      0t0  TCP *:3000 (LISTEN)
=======
COMMAND PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
ruby      1 root    9u  IPv4 255918      0t0  TCP *:3000 (LISTEN)
=======