全力で怠けたい

怠けるために全力を尽くしたいブログ。

特定のポートを使ってるプロセスを lsof コマンドで確認する方法。

特定のポートを使ってるプロセスを 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 を使ってるプロセスだけ表示するとかできてかなり便利。

参考サイト