このポートで実行中のプロセスはどれ? lsofコマンドの使い方ネットワーク管理の基本Tips

プロセスが開いているファイルを表示するコマンド「lsof」は、プロセスやソケットなどのあらゆる情報をファイルの形で管理するUNIX/Linuxの特性を生かしたもの。プロセスが使用するポートの調査に役立ちます。

» 2015年10月05日 05時00分 公開
[海上忍@IT]

バックナンバー

連載バックナンバー

 本連載では、ネットワーク管理の基本コマンドを順を追って紹介していきます。基本書式と用法、主要なオプション、用例サンプルを示しますので、manやhelp代わりに通読し、各コマンドでできることを順次おさらいしてみてください。今回は、プロセスが開いているファイルを調べる際に使う「lsof」コマンドを紹介します。

 なお、本連載では、執筆時点の最新版「Red Hat Enterprise Linux(RHEL)」および「CentOS」環境で動作を確認しています。また、用法事例はIPv4(Internet Protocol version 4)ネットワークを前提にしています。コマンドのサンプルなどで一部環境に依存した出力例となる場合がありますので、その際には適宜ご自身の環境に合わせて読み替えてください。

プロセスが使用するポートを確認する書式

lsof [オプション[:[ポート番号|サービス]] [ファイル|プロセス]

※[ ]は省略可能な引数を示しています。|で区切った項目は、どちらか一つを指定します。


lsofコマンドとは?

 lsofコマンドは「LiSt Open Files」(開いているファイル群を列挙する)という言葉に由来します。その名の通り、「プロセスが開いているファイル」を表示するコマンドです。

 UNIX/Linuxでは、一般的なファイルだけでなく、ネットワークソケットやデバイスドライバー、プロセス情報なども「ファイル」として扱います。そのため、開かれているファイルを調べることで、待機ポートやネットワークのマッピング情報などを把握できます。lsofコマンドによって「あるファイルを開いているプロセス」「あるポートにアクセスしているプロセス」を特定し、「不要なプログラムが実行されていないか」「不正なプログラムが動作していないか」を調べることができます。

 引数にファイルを与えて実行すると、そのファイルを使用中のプロセスID(PID)の一覧が出力されます。


lsofコマンドの主なオプション

 lsofコマンドの主なオプションは次の通りです(表1)。

表1 主なオプション
オプション 意味
-P ポート番号をサービス名に変換しない
-c プロセス名を指定する
-i ネットワークソケットファイルを表示する
-n IPアドレスを表示する(名前解決しない)
-p プロセスIDを指定する

 「-c」オプションに続けてプロセス名を指定すると、そのプロセスが開いているファイルを特定できます。プロセス名ではなくPIDで絞り込む場合には、「-p」オプションを利用します。

 待機ポートを確認する場合は、「-i」オプションを利用します。引数を指定しない場合は、全てのポートを対象に使用の有無を確認できます。ポートで絞り込む場合は、「i:XXXX」の要領でポート番号を指定します。

 なお、lsofコマンドで表示できるファイル/ポートは、lsofコマンドを実行するユーザーに対し読み取り権限が与えられているものに限られます。ネットワークソケットファイルは一般ユーザーに対し読み取り権限が与えられていないため、多くの場合はrootまたはsudoコマンドと組み合わせて、管理者権限で実行します。


待機ポートとプロセスを確認するには?

 ローカルホストの待機ポートとプロセスを一覧する場合は、ネットワークソケットファイルを表示するオプション「-i」を引数なしで実行します。

 このとき、IPアドレスをホスト名に変換しないように「-n」オプションを、ポート番号をサービス名に変換しないように「-P」オプションを併せて指定すると、高速に結果が得られます。

 出力される項目の内容と意味は表2の通りです。

表2 出力項目と意味
項目 意味
COMMAND 実行中のプログラム
PID プロセス番号
USER 実行ユーザー
FD ファイルディスクリプター(/proc/<PID>/fd)
TYPE ファイル種別
DEVICE デバイス番号
SIZE/OFF ファイルサイズ
NODE プロトコル
NAME ファイルまたはポート

 待ち受け状態のポートは「(LISTEN)」と表示されています。下の実行例では、Sambaサーバーのデーモン(smbd)が待ち受け状態になっており、該当のポートとプロセスIDが分かります。

$ sudo lsof -i -n -P
COMMAND     PID    USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
avahi-dae   742   avahi   12u  IPv4  16986      0t0  UDP *:5353 
avahi-dae   742   avahi   13u  IPv4  16987      0t0  UDP *:46148 
chronyd     757  chrony    1u  IPv4  16594      0t0  UDP *:123 
chronyd     757  chrony    2u  IPv6  16595      0t0  UDP *:123 
  ・
  ・
smbd      2198  root   27u  IPv4   7258      0t0  TCP *:445 (LISTEN)
smbd      2198  root   28u  IPv4   7260      0t0  TCP *:139 (LISTEN)
  ・
  ・

特定のポートで実行中のプロセスを調べるには?

 特定のポート番号で実行中のプロセスを調べる場合には、「-i:XX」の要領で「-i」オプションに続けてポート番号を指定します。sshdは22番、httpdは80番などと主要なサービスにはポート番号が割り当てられているため(ウェルノウンポート)、通常はその番号を指定します。

 なお、「-i」オプションではポート番号だけでなく、サービス名も指定できます。例えば、sshに関するサービスを調べる場合は「-i:ssh」の要領で指定します。

 下の実行例では、22番ポートで実行中のプロセスを表示しています。

$ sudo lsof -i:22 -P
COMMAND  PID USER   FD   TYPE DEVICE SIZE/OFF NODE NAME
sshd    2364 root    3u  IPv4    918      0t0  TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED)
sshd    2368   pi    3u  IPv4    918      0t0  TCP linbox.local:22->MBAir.local:61723 (ESTABLISHED)
sshd    2490 root    3u  IPv4   8220      0t0  TCP *:22 (LISTEN)

「ネットワーク管理の基本Tips」バックナンバー

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。