0

lsof:知ってます → 使えます にする為の記事

今日のコマンド

TCP通信の接続状況を調べる

こんな時使う


あるプロセスが開いているポート番号を調べる方法
lsof コマンドを使うとプロセスが開いているファイル(ソケットも含む)を見れます。
-n は名前解決しないためのオプション。
-P はポート番号をポート名に変換しないようするオプション

*注* オプションを複数指定でOR実行してくれる

$ sudo lsof -n -P -p [PID] | grep TCP
/home/sonots   606 sonots    4u  IPv4 3718314992      0t0  TCP *:8080(LISTEN) 

逆にポート番号から、プロセスIDを調べる場合は lsof -i:[PORT]
※ 補足: ホスト名まで指定する場合は -i@[HOST]:[PORT]

$ sudo lsof -P -i:8080
COMMAND     PID USER   FD   TYPE     DEVICE SIZE/OFF NODE NAME
/home/sonots   606 sonots    4u  IPv4 3718314992      0t0  TCP *:8080(LISTEN)

netstat に -p オプションをつけると PID が出てくるので、それを grep するという手もある。

$ sudo netstat -anp
Proto Recv-Q Send-Q Local Address Foreign Address State  PID/Program name   
tcp        0      0 0.0.0.0:8649  0.0.0.0:*       LISTEN 24381/gmond         
tcp        0      0 0.0.0.0:8080  0.0.0.0:*       LISTEN 606/plackup  
$ sudo netstat -anp | grep 606     
tcp        0      0 0.0.0.0:8080  0.0.0.0:*       LISTEN 606/plackup
ls -l /proc/`pgrep -n java`/fd

pgrepでプロセスID取得して、/proc内を探してますが、いかんせんコマンドが面倒な気がします。
lsofを使うと簡単に調べられます。(出力はちょっとアレですが)

lsof - list open files

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

ファイルを指定

# lsof /var/log/httpd/access_log
COMMAND   PID   USER   FD   TYPE DEVICE SIZE/OFF   NODE NAME
httpd   12727   root    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   12727   root    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22130 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22130 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22187 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22187 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22188 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22188 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22189 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22189 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22191 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22191 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22192 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22192 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22193 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22193 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22194 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22194 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22195 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22195 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22799 apache    8w   REG  252,3   897028 399272 /var/log/httpd/access_log
httpd   22799 apache    9w   REG  252,3   897028 399272 /var/log/httpd/access_log

-pオプションでプロセスID指定

### プロセスID指定
lsof -p 12345
### pgrepで指定
lsof -p `pgrep -n java`

-cオプションでプロセス名指定

lsof -c java

-uオプションでユーザ指定

lsof -u hoge

-iオプション [@IPアドレス:ポート番号]
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がつかんでましたね。
こんな時はwriteコマンドでメッセージでも送って出て行ってもらいましょー

以上です。


コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です