本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、オープンしているファイルを一覧表示する「lsof」コマンドです。
本連載は、Linuxのコマンドについて、基本書式からオプション、具体的な実行例までを紹介していきます。今回は、オープンしているファイルを一覧表示する「lsof」コマンドです。
「lsof」はオープンしているファイルを一覧表示するコマンドです。
lsof [オプション] [パス名]
※[ ]は省略可能な引数を示しています。
短いオプション | 意味 |
---|---|
-a | 複数のオプションを指定した際に、AND(かつ)の意味で機能させる |
-u ユーザー | 表示対象にしたいユーザーの名前またはユーザーIDを指定する(※1) |
-p プロセスID | 表示対象にしたいプロセスIDを指定する(※2) |
-c 文字列 | 表示対象にしたいプロセスの先頭文字列を指定する(※3) |
+c 文字数 | プロセス名を表示する際の長さを指定する(※4) |
-d 数字 | 表示対象にするファイルディスクリプタ(※5) |
+d ディレクトリ | 表示対象にするディレクトリ名(※6) |
+D ディレクトリ | 表示対象にするディレクトリ名(サブディレクトリ以下も対象になる) |
-D | デバイスキャッシュファイルを使用する |
-e ディレクトリ | 対象外にするディレクトリ |
-i | ネットワークソケットを対象にする(※7) |
-T | TCPの状態(LISTENなど)を表示しない |
-X | TCP/UDPのファイルを対象外にする(-iと同時には使用できない) |
-l | ユーザー名の換わりにユーザーIDを表示する |
-n | ホスト名の換わりにIPアドレスを表示する |
-P | ポート名の換わりにポート番号を表示する |
-R | 親プロセスのプロセスID(PPID)を表示する |
-t | プロセスIDのみを表示する(警告を出力しないオプション「-W」も同時に指定した扱いになる) |
+L | リンク数(NLINK欄)を表示する |
-L | リンク数(NLINK欄)を表示しない(デフォルト) |
-o | SIZE/OFF欄で常にオフセット(OFFSET)を表示する |
+w | 警告(warning)を表示する |
-- | オプションの区切り。「--」以降はオプションではなくファイル名として扱う |
※1 指定したユーザー以外を選ばせたい場合は「^」を付けて「-u ^username」のように記述する。user1とuser2を指定したい場合は「-u user1 -u user2」のように記述する。
※2 1以外を指定する場合は「-p ^1」、1または2を指定する場合は「-p 1 -p 2」のように記述する。
※3 「-c sys」と指定すると名前がsysから始まるプロセスを選択し、「-c a -c b」と指定すると、aから始まるプロセスとbから始まるプロセスを表示する。「^」で否定し、「/文字列/」で正規表現になる。
※4 デフォルトは9、最大15。0を指定するとプロセス名全てを表示する。
※5 「-d ^5」や「-d 3-10」といった指定が可能。シェル以外のプロセスは標準入出力0〜2に続く3番以降を使用する。
※6 「+d /var/log」で、/var/log以下のファイルを対象にする。
※7 「-i」で全てのネットワークソケットを対象にする。「-i4」でIPv4、「-i6」でIPv6を指定できる。この他、「-iTCP」「-iUDP」「-i@ホスト」「-i:ポート番号」を指定可能。
「lsof」で現在開いているファイルを一覧表示します(画面1)。
表示する項目は、次の表の通りです。この他、オプションや対象の指定によってTID(スレッドID)や、PPID(親プロセスのプロセスID)、NLINK(リンク数)なども表示します。
項目名 | 内容 |
---|---|
COMMAND | ファイルを開いているプロセスのコマンド名 |
PID | プロセスのPID |
USER | ユーザー名 |
FD | ファイルディスクリプタ(※8) |
TYPE | 種類 |
DEVICE | デバイス |
SIZE/OFF | ファイルサイズまたはオフセット |
NODE | iノード番号 |
NAME | ファイル名 |
※8 シェル以外のプロセスは標準入出力0〜2に続く3番以降を使用する。数字の後にr(read access)、w(write access)、u(readとwrite両方)を表示する。また、プロセスによってはcwd(カレントディレクトリ)、mem(memory-mapped file)、txt(program text)などを表示することもある。
調査対象にしたいファイルが決まっている場合は、引数で指定します。「/var/log/」など、アクセス権が必要なフォルダのファイルを調べる場合はroot権限が必要です。sudoコマンド(連載第68回)などを利用してください。
lsof
(現在開いているファイルを一覧表示する)
lsof /var/log/*
(「/var/log/*」で開いているファイルを一覧表示する)(画面1)
「-u ユーザー」で対象にするユーザーを指定できます。複数ユーザーを指定する場合は「-u ユーザー1 -u ユーザー2」のように指定します。このように、表示対象を指定するオプションは、「OR(または)」の関係になります。
対象ファイルを引数で指定するのではなく、ディレクトリで指定したい場合は、「+D ディレクトリ」と指定します。
ユーザーとディレクトリを指定したい場合、「AND(かつ)」の関係にするため「-a」オプションを併用します。
画面2はrootユーザーで実行しています。また、表示内容が多いので、headコマンドで先頭部分のみを表示しています。
lsof -u ユーザー
(対象のユーザーを指定する)
lsof -u study -u penguin
(ユーザー「study」とユーザー「penguin」のどちらかが開いているファイルを対象にする)
lsof -a -u study +D /var
(ユーザー「study」が「/var」ディレクトリ下で開いているファイルを対象にする。ANDの関係にするため「-a」も指定))(画面2)
lsofの出力が長くて読みにくい場合は、awkコマンドやcutコマンドと組み合わせてもよいでしょう。
画面3の最初のコマンドラインで使用している「+c 0」は、プロセス名(COMMAND欄)を途中で切らずに全て出力するオプションです。パイプライン後段のawkコマンドでは1番目、2番目、9番目のフィールドを出力しています。
画面3の2番目のコマンドラインで使用している「+c 15」は、プロセス名を15文字で出力するというオプションです。cutコマンドでは、1文字目から20文字目と、63文字目以降を出力しています。
lsof +c 0 /var/log/* | awk '{print $1,$2,$9}'
(1、2、9番目のフィールドのみを出力する)(画面3)
lsof +c 15 /var/log/* | cut -b 1-20,63-
(1-20文字目と63文字目以降を出力する)(画面3)
「-p プロセスID」または「-c プロセス名」で、表示対象のプロセスを指定できます(画面4)。「-c」ではプロセス名の全体を指定する必要はなく、先頭部分だけで構いません。
lsof -p 5
(プロセスIDが5のプロセスのみを出力対象にする)
lsof -c kworker
(プロセスのコマンド名がkworkerのものを出力対象にする)
「-i」オプションを使うと、「-i:ポート」や「-iTCP」のようにして、ポート番号やプロトコルを指定して表示できます。画面5は、rootユーザーで実行しています。
lsof -i
(ネットワークソケットのみを対象にする)(画面5)
lsof -i:80
(ポート番号80のみを対象にする)
lsof -i:ssh
(ポート番号20のsshのみを対象にする)(画面5)
lsof -iTCP
(TCP接続のみを対象にする)
lsof -i@192.168.1.126
(「192.168.1.126」からの接続のみを対象にする)
西村 めぐみ(にしむら めぐみ)
元々はDOSユーザーで「DOS版UNIX-like tools」を愛用。ソフトハウスに勤務し生産管理のパッケージソフトウェアの開発およびサポート業務を担当、その後ライターになる。著書に『図解でわかるLinux』『らぶらぶLinuxシリーズ』『Accessではじめるデータベース超入門[改訂2版]』『macOSコマンド入門』など。地方自治体の在宅就業支援事業にてMicrosoft Officeの教材作成およびeラーニング指導を担当。会社などの"PCヘルパー"やピンポイント研修なども行っている。
Copyright © ITmedia, Inc. All Rights Reserved.