特定のポートを使ってるプロセスを lsof コマンドで確認する方法をメモしておく。
特定のポートを使ってるプロセスを確認する方法
lsof コマンドを使って特定のポートを使ってるプロセスを確認する方法を書いていく。
lsof コマンド
lsof コマンドは man lsof すると lsof - list open files と表示するとおりオープンしているファイルを表示するコマンド。
Linux はいわゆるファイル以外にもネットワークソケット、デバイスドライバーとかプロセス情報などもファイルとして扱うので、オープンしているファイルとそのファイルをオープンしているプロセスを調べることで特定のポートを使ってるプロセスを調べることができる。
lsof コマンドは -i オプションを指定するとネットワークソケットに関するプロセスだけを表示するので主に -i オプションの指定方法を書いていく。
lsof コマンドのバージョン。
$ lsof -v
lsof version information:
revision: 4.91
latest revision: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/
latest FAQ: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/FAQ
latest man page: ftp://lsof.itap.purdue.edu/pub/tools/unix/lsof/lsof_man
configuration info: libproc-based
Anyone can list all files.
/dev warnings are disabled.
Kernel ID check is disabled.
lsof コマンドの表示項目
lsof コマンドの表示項目について軽くメモしておく。
$ lsof | head -1 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
それぞれの項目の意味を書いていく。
| 項目 | 意味 |
|---|---|
| COMMAND | ファイルを開いてるプロセスのコマンド名。e.g. Google, com.docke |
| PID | プロセス ID |
| USER | ユーザー名 |
| FD | ファイルディスクリプタ |
| TYPE | 種類。e.g. IPv4, IPv6, unix |
| DEVICE | デバイス |
| SIZE/OFF | |
| NODE | プロトコル。e.g. TCP, UDP |
| NAME | ファイル名あるいはポート |
-i:<ポート番号> で 特定のポートを使ってるプロセスを確認
-i オプション で -i:<ポート番号> みたいにすると特定のポート番号を使ってるプロセスだけを表示する。
たとえば 8080 番ポートを使ってるプロセスを確認するなら lsof -i:8080 みたいに実行する。
$ lsof -i:8080 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME Google 496 who 21u IPv6 0xbf915afa7c00c5e1 0t0 TCP localhost:59317->localhost:http-alt (ESTABLISHED) Google 496 who 22u IPv6 0xbf915afa7c00d221 0t0 TCP localhost:59318->localhost:http-alt (ESTABLISHED) com.docke 1511 who 51u IPv6 0xbf915afa9f554121 0t0 TCP *:http-alt (LISTEN) com.docke 1511 who 52u IPv6 0xbf915afa7c00cc01 0t0 TCP localhost:http-alt->localhost:59317 (ESTABLISHED) com.docke 1511 who 53u IPv6 0xbf915afa7c00b9a1 0t0 TCP localhost:http-alt->localhost:59318 (ESTABLISHED)
-i:<サービス名> で 特定のポートを使ってるプロセスを確認
ウェルノウンポートが割り当てられてるサービスは -i オプションで -i:<サービス名> みたいにサービス名を指定することもできる。
たとえば ssh (22 番ポート) を使ってるプロセスを確認するなら lsof -i:ssh みたいに実行する。
ウェルノウンポートはポート番号とサービス名のマッピングはわりと自明なのと自分が使ってるプログラムはウェルノウンポートとは違うポートを使ったりするので -i オプションをこの使い方で使うことはあまりない。
$ lsof -i:ssh COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 17350 who 3u IPv4 0xbf915afa83a0c291 0t0 TCP xxx.xxx.xxx.xxx:59395->ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com:ssh (ESTABLISHED)
-n オプション: 名前解決をしない
lsof コマンドはデフォルトで接続先ホストの名前解決をするけど -n オプションを指定すると名前解決しなくなる。
lsof コマンドが名前解決しなくなる分、lsof コマンドの実行速度が速くなる (かもしれない)
-n オプションを指定しないと接続先ホストが ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com みたいに名前解決して表示する。
$ lsof -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 17350 who 3u IPv4 0xbf915afa83a0c291 0t0 TCP xxx.xxx.xxx.xxx:59395->ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com:ssh (ESTABLISHED)
-n オプションを指定すると接続先ホストが yyy-yyy-yyy-yyy みたいに IP アドレスが表示する。
$ lsof -n -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 17585 who 3u IPv4 0xbf915afa960b1291 0t0 TCP xxx.xx.xxx.xxx:59623->yyy.yyy.yyy.yyy:ssh (ESTABLISHED)
-P オプション: ポート番号をサービス名に変換しない
lsof コマンドはデフォルトでポート番号をサービス名に変換して表示するけど -P オプションを指定するとポート番号をサービス名に変換しなくなる。
lsof コマンドがポート番号をサービス名に変換しなくなる分、lsof コマンドの実行速度がチョット速くなる (かもしれない)
-P オプションを指定しないと22番ポートが ssh みたいにサービス名に変換して表示する。
$ lsof -n -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 17585 who 3u IPv4 0xbf915afa960b1291 0t0 TCP xxx.xx.xxx.xxx:59623->yyy.yyy.yyy.yyy:ssh (ESTABLISHED)
-P オプションを指定すると22番ポートがそのまま 22 と表示する。
個人的にはポート番号はサービス名に変換しないでそのまま表示するほうが分かりやすいので -P オプションはデフォで指定してる。
$ lsof -P -i:22 COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME ssh 17585 who 3u IPv4 0xbf915afa960b1291 0t0 TCP xxx.xxx.xxx.xxx:59623->ec2-yyy.yyy.yyy.yyy.ap-northeast-1.compute.amazonaws.com:22 (ESTABLISHED)
-i オプションの他の使い方
-i オプションは -iUDP みたいにして UDP のポートを使ってるプロセスだけ表示するとか -i@ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com みたいにして接続先ホストが ec2-yyy-yyy-yyy-yyy.ap-northeast-1.compute.amazonaws.com のプロセスだけ表示するとか -i6 みたいにして IPv6 を使ってるプロセスだけ表示するとかできてかなり便利。