lsofの使い方 - プロセスが使用中のファイルを調べる

ls -l /proc/`pgrep -n java`/fd

lsofでも調べられます。

lsof - list open files

lsof

うにょうにょと結果が出てきます。が、多すぎて訳わからん。

  • -pオプションでプロセスID指定
### プロセスID指定
lsof -p 12345
### バッククォート使うとこんな感じ
lsof -p `pgrep -n java`
  • -cオプションでプロセス名指定
lsof -c java
  • -uオプションでユーザ指定
lsof -u hoge

listenしてるポートを出力。指定したポートのみ表示することもできる。

lsof -i           # Listenしてるのずらずら表示
lsof -i :22       # ssh
lsof -i :22,80    # ssh or http
lsof -i :http     # 名前でもいける
lsof -i @192.168.0.1    # interface指定
lsof -i @192.168.0.1:80 # interfaceとポート指定
  • -aオプションでAND

オプション複数指定するとORで出力されるようです。なのでプロセスとユーザの両方を指定したいときは-aをつける。

lsof -a -u hoge -c java

オプションなしでファイルシステム(ディレクトリ、ファイル)を指定すると、そのファイルシステムを使用中のプロセスが出てきます。例えば、こんなときに使う。(パスは絶対パスで指定する必要あり)

root # umount /media/cdrom
umount: /media/cdrom0: デバイスを使用中です
umount: /media/cdrom0: デバイスを使用中です

CD-ROMがアンマウントできない!!なんで?て時にlsofの出番。

root # lsof /media/cdrom
COMMAND  PID USER   FD   TYPE DEVICE SIZE NODE NAME
zsh     6367 hoge  cwd    DIR   11,0 2048 1600 /media/cdrom0

ユーザhogeがcdしてた、みたいな。こんな時はwriteコマンドでメッセージでも送って出て行ってもらいましょう :-)