Linux lsof コマンドの使用方法の詳細な説明

Linux lsof コマンドの使用方法の詳細な説明

lsof (開いているファイルのリスト) は、プロセスによって開かれたファイルを表示するツールです。

Linux では、すべてがファイルです。ファイルは、通常のデータだけでなく、ネットワーク接続やハードウェアへのアクセスも提供します。したがって、lsof コマンドは、プロセスによって開かれたファイルやディレクトリを表示できるだけでなく、プロセスがリッスンしているポートなどのソケット関連の情報も表示できます。この記事では、lsof コマンドの基本的な使い方を紹介します。この記事のデモ環境は Ubuntu 18.04 です。

共通オプション

-aは他のオプションがAND関係にあることを示します
-c <プロセス名> 指定されたプロセスによって開かれた出力ファイル
-d <ファイル記述子>はファイル番号を占有しているプロセスをリストします
+d <ディレクトリ> ディレクトリと、そのディレクトリ下の開いているファイルとディレクトリを出力します(再帰的ではありません)
+D <ディレクトリ> は、ディレクトリ内で開かれているファイルとディレクトリを再帰的に出力します。
-i <条件> 条件を満たすネットワーク関連ファイルを出力します
-n ホスト名を解決しない
-p <プロセス番号> 指定されたPIDのプロセスによって開かれたファイルを出力します
-P ポート番号を解決しない
-t PIDのみ出力
-u 指定されたユーザーが開いたファイルを出力します
-U 開かれたUNIXドメインソケットファイルを出力する
-h ヘルプ情報を表示する
-v バージョン情報を表示する

基本出力

オプションなしで lsof コマンドを実行すると、システム内のすべてのアクティブなプロセスによって開かれているすべてのファイルが出力されます。その結果、意味をなさない出力情報が大量に表示されます。まず、lsof コマンドで現在の Bash プロセスによって開かれたファイルを出力し、その結果の一部を傍受して、出力に含まれる情報を確認してみましょう。

コマンド: プログラムの名前
PID: プロセス識別子
ユーザー: プロセス所有者
FD: ファイル記述子、アプリケーションはファイル記述子を通じてファイルを識別します
TYPE: DIR、REG などのファイル タイプ。
DEVICE: カンマ区切りのデバイス番号
サイズ: ファイルサイズ (バイト)
NODE: インデックス ノード (ディスク上のファイルの識別子)
NAME: 開くファイルの正確な名前

以下、FD 列と TYPE 列の共通内容について簡単に紹介します。
FD 列の一般的な内容には、cwd、rtd、txt、mem、およびいくつかの数字などが含まれます。ここで、cwd は現在の作業ディレクトリ、rtd はルート ディレクトリ、txt はプログラムの実行可能ファイル、mem はメモリ マップ ファイルを表します。

標準入力ファイルや標準出力ファイルなど、一部の FD は数字で表されます。

数字の後の文字は、ファイルに対するプロセスの読み取り/書き込みモードを示します。たとえば、上の図の u は、ファイルが開かれ、読み取り/書き込みモードであることを意味します。 u に加えて、読み取り専用モードの r、書き込み専用モードの w、書き込み専用モードの W もあります。また、W を使用して、プロセスがファイルに対して書き込みロックを持っていることを示すこともできます。次の図は、docker デーモン プロセスによって開かれたファイルのリストであり、FD のさまざまなモードを示しています。

TYPE 列の共通 REG と DIR は、それぞれ通常のファイルとディレクトリを表します。 CHR と BLK はそれぞれ文字デバイスとブロックデバイスを表し、unix、fifo、IPv4/IPv6 はそれぞれ UNIX ドメインソケット、先入れ先出し (FIFO) キュー、IPv4/IPv6 ソケットを表します。

以下では、lsof コマンドの一般的な使用方法をいくつか紹介します。

どのプロセスがファイルを開いているか確認する

lsof の引数としてファイル名を指定するだけで、どのプロセスがファイルを開いたかを確認できます。次のコマンドは、/bin/bash ファイルを開いたプロセスを照会します。

$ sudo lsof /bin/bash 

通常のファイルに加えて、デバイス ファイルも対象となります (次のコマンドの出力は非常に長く、図はその一部にすぎません)。

$ sudo lsof /dev/sda1 

どのプロセスがディレクトリとその下のファイルを開いたかを確認します

ここでは 2 つのケースがあります。+d オプションは再帰クエリを実行せず、指定されたディレクトリを開いたプロセスと、指定されたディレクトリの下のファイルとディレクトリのみを検索します。次に例を示します。

$ sudo lsof +d /var/log 

+D オプションは指定されたディレクトリに再帰的に移動されます。

$ sudo lsof +D /var/log 

ファイル システムをアンマウントするときに、ファイル システム内でファイルまたはディレクトリを開いているプロセスがあると、アンマウント操作は失敗します。したがって、ファイル システムをアンマウントする前に、lsof +D を使用してファイル システムのマウント ポイントを確認し、関連するプロセスを強制終了してから、アンマウント操作を実行することをお勧めします。

プロセスによって開かれたすべてのファイルを表示する

-p オプションを使用してプロセスの PID を指定すると、そのプロセスによって開かれたすべてのファイルを出力できます。たとえば、cron プログラムによって開かれたファイルを表示する場合は、まず ps -C cron コマンドを使用してプロセスの PID を確認します。

次に、PID を lsof コマンドの -p オプションに渡します。

$ sudo lsof -p 1152 

複数のオプションを組み合わせる

lsof コマンドに複数のオプションを指定する場合、これらのオプション間のデフォルトの関係は OR になります。つまり、いずれかのオプションに該当する結果が出力されます。追加の -a オプションを追加すると、他のオプション間の関係が AND になります。たとえば、次のコマンドのように:

$ sudo lsof -a -p $$ -d0,1,2 

-p オプションは現在のプロセスの PID を指定し、-d オプションはプロセスによって開かれたファイル記述子を指定するために使用されます (複数のファイル記述子はコンマで区切ることができます)。 -a オプションを追加すると、現在のプロセスによって開かれたファイル記述子 0、1、および 2 を持つファイルが出力されます。
注意: -a オプションを使用するには多くの条件があります。詳細については、lsof のマニュアル ページを参照してください。

指定した名前のプログラムによって開かれたファイルを表示する

-c オプションを使用すると、プロセスを実行しているプログラム (実行可能ファイル) の名前を一致させることができます。たとえば、文字 cr で始まるプログラムによって開かれたファイルのリストを検索します。

$ sudo lsof -c cr 

複数の -c オプションを同時に指定することもできます。それらの関係は OR です。
-c オプションの条件を否定したい場合は、文字列の前に ^ 記号を追加します。例:

$ sudo lsof -c ^cr

-c オプションは正規表現もサポートします。たとえば、次のコマンドは、cra および cro で始まるプログラムによって開かれたファイルを除外できます。

$ sudo lsof -c /cr[ao]/

開かれたネットワーク関連ファイルを表示する

-i オプションは、開かれたネットワーク関連ファイルを表示するために使用されます。パラメータの形式は次のとおりです。
[46][プロトコル][@ホスト名|ホストアドレス][:サービス|ポート]
46はIPプロトコルのバージョンを示します
プロトコルはTCPやUDPなどのネットワークプロトコルの名前を表します。
ホスト名またはhostaddrはホストアドレスを示します
サービスは、smtpや複数のサービスのリストなど、/etc/services内の名前を参照します。
portはポート番号を示します。1つ以上のポート番号を指定できます。

-i オプションは、デフォルトで IPv4 と IPv6 の両方の開かれたファイルを出力します。

$ sudo lsof -i 

IPv4またはIPv6で開かれたファイルのみを一覧表示する

$ sudo lsof -i 4
$ sudo lsof -i 6 

ポート22に関連するファイルを一覧表示する

$ sudo lsof -i:22 

指定された範囲内の開いているTCPポートを一覧表示します

$ sudo -i TCP:1-1024 

開かれたUNIXドメインソケットファイルを表示する

-U オプションは、開かれた UNIX ドメイン ソケット ファイルを出力します。ここでは、-c オプションを組み合わせて、ssh サービスによって開かれた UNIX ドメイン ソケット ファイルを表示します。

$ sudo lsof -a -c sshd -U

ユーザーが開いたすべてのファイルを表示する

-u オプションではユーザー名またはユーザー ID を指定できます。また、-c オプションと同様に、複数のユーザー名またはユーザー ID をコンマで区切ることができ、条件は ^ 記号で否定できます。
ユーザーが開いたすべてのファイルを表示する

$ sudo lsof -u syslog

ユーザー nick が開いたネットワーク関連ファイルを表示する

$ sudo lsof -a -i -u ニック

ユーザーを除外する

$ sudo lsof -i -u ^ニック

注意: 除外条件がある場合は、-a オプションを指定する必要はありません。

特定のユーザーがファイルを開いているすべてのプロセスを強制終了します。

$ kill -9 $(lsof -t -u ニックネーム)

コマンドの -t オプションは、lsof コマンドにプロセスの PID のみを出力するように指示します。

システムによって開かれたファイルの総数をカウントする

$ sudo lsof -P -n | wc -l 

コマンド内の -P オプションはポート番号を解決しないことを意味し、 -n オプションはホスト名を解決しないことを意味します。これら 2 つのオプションの主な目的は、lsof コマンドの実行速度を向上させることです。 wc -l コマンドは、lsof コマンドによって出力される行数をカウントするために使用されます。

削除されたファイルを回復する

誤ってファイルを削除し、そのファイルがプロセスによって開かれていることが分かっている場合は、lsof コマンドを使用してファイルを復元できます。具体的な原則は次のとおりです。
プロセスがファイルを開くと、ファイルが削除されたとしても、プロセスがファイルを開いたままにしている限り、ファイルはディスク上に残ります。プロセスはファイルが削除されたことを認識せず、ファイルを開いたときに提供されたファイル記述子を使用して、引き続きファイルの読み取りと書き込みを行うことができます。対応するディレクトリ inode が削除されているため、このファイルはプロセス以外には表示されません。

プロセスによって開かれたファイル記述子は、/proc/PID/fd ディレクトリに保存されます。 /proc ディレクトリはメモリにマップされた領域にマウントされるため、これらのファイルとディレクトリはディスク上に存在しません。したがって、これらのファイルを読み書きする場合、実際にはメモリから関連情報を取得しています。 lsof プログラムは、この情報とカーネルの内部状態に関するその他の情報を使用して出力を生成します。したがって、lsof はプロセスのファイル記述子や関連ファイル名などの情報を表示できます。つまり、プロセスのファイル記述子にアクセスすることで、ファイルに関する関連情報を見つけることができます。

次のデモは、lsof コマンドを使用して、誤って削除された /var/log/syslog ファイルを復元する方法を示しています。

まず、ログ ファイル /var/log/syslog を削除します。念のため、このファイルを事前にバックアップしておいてください。

$ sudo rm /var/log/syslog 

上記の情報から、PID 1141 のプロセスがファイルを開いており、ファイル記述子が 7 であり、ファイルが削除されたことがわかります。次に、プロセス 1141 のファイル記述子を通じてファイルの内容を表示します。

$ sudo テール -n 5 /proc/1141/fd/7 

上の図は、ファイル /var/log/syslog の内容がまだ存在し、ファイル記述子を介してアクセスできることを示しています。次に、IO リダイレクトによって /var/log/syslog ファイルを再作成します。

$ sudo sh -c 'cat /proc/1141/fd/7 > /var/log/syslog'

次に、ファイルの権限を修正し、rsyslog サービスを再起動します。

$ sudo chown syslog:adm /var/log/syslog
$ sudo systemctl rsyslog.serviceを再起動します

これにより、/var/log/syslog ファイルの回復が完了します。多くのアプリケーション、特にログ ファイルとデータベース ファイルは、この方法で回復できます。

ヘルプ

-h オプションは、lsof コマンドのヘルプ情報を出力します。

この種のヘルプ情報では、man ページを読むしかなくなると思います。

要約する

lsof は、マニュアルページの長さからもわかるように、単純なコマンドではありません。この記事で紹介した小さなデモから始めると、長いドキュメントを忘れて、段階的に使用を開始し、最終的にこのコマンドを習得できるようになります。

参照:
lsof マニュアルページ
Linux lsofコマンドの詳細な説明
Linux の lsof コマンドの例 10 個
初心者向け Linux lsof コマンド チュートリアル (例 10 個)
15 Linux lsof コマンドの例 (開いているファイルの識別)

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • Linux exa コマンド (ls よりも優れたファイル表示エクスペリエンス)
  • Linux で ls コマンドを使用して日付順にファイルを並べ替える方法
  • Linux コマンドラインで ls を使用してファイルを一覧表示するヒント
  • Linux の ls コマンドパラメータの詳細な説明と ls コマンドの使用例
  • Linux ls コマンドのチュートリアルと ls コマンドの使用方法
  • Linux lsof コマンドの詳細な説明と例
  • Linux での ls コマンドの使い方の詳細な説明
  • Linux C エミュレーション ls コマンドの詳細な説明
  • Linux ls コマンドパラメータの詳細な説明
  • Linux lsコマンドの使用

<<:  MySQL sql_modeの適切な設定に関する詳細な説明

>>:  WeChat アプレット wxs 日付と時刻処理の実装例

推薦する

Zabbixを介してデータベース接続情報といくつかの拡張機能をすばやく取得します

背景アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッ...

Vue は Websocket カスタマー サービス チャット機能を実装します

この記事では主に基本的なチャットの実装方法を紹介します。今後は絵文字や写真のアップロードなどの機能も...

小さな三角形の実装コードを含む CSS ナビゲーション バー メニュー

多くの Web ページにはナビゲーション バーに小さな三角形があり、この機能を実装するのは実は非常に...

CSS スティッキー配置位置の詳細な説明: スティッキー問題の落とし穴

前書き: position:sticky は CSS ポジショニングの新しい属性です。相対ポジショニ...

srcまたはcss背景画像のurl値はbase64でエンコードされたコードです

ウェブ上の一部の画像の src または CSS 背景画像 URL の後に、data:image/pn...

CocosCreator システムイベントがどのように生成され、トリガーされるかについての詳細な説明

目次環境まとめモジュール機能関連文書ソースコード分析CCGame.js CCInputManager...

MySQLデータ行と行オーバーフローのメカニズムの詳細な説明

1. 行の形式は何ですか? MySQL の行形式の設定は次のように表示されます。 実際、MySQL ...

サブセットかどうかを判断するためのMySQLメソッドの手順

目次1. 問題2. 解決策オプション1:オプション2: 1. 問題この話は、エラーと脱落率を照会する...

Vueはショッピングカート決済機能をシミュレートします

この記事では、ショッピングカート決済機能を実現するためのVueの具体的なコードを例として紹介します。...

Dockerは起動されていないコンテナの設定情報を変更します

私が初めてdockerを使用したときは、dockerfileやdocker-composeを使用して...

Ubuntu 18.04 サーバーのパスワードを忘れたり改ざんされた場合にパスワードをリセットする方法

最近、サーバー上のアカウントが2つハッキングされ、パスワードが改ざんされました。幸い、まだ使えるアカ...

Linuxのファイル操作の知識ポイントを詳しく解説

ファイル操作に関連するシステムコール作成するint creat(const char *ファイル名,...

aタグ内のテキストを非表示にして画像を表示するには?360モードレンダリングに対応

多くの場合、画像を表示する<a>タグのスタイルに遭遇しますが、タグ内にテキストがあり、そ...

Linux パーティションまたは論理ボリュームにファイルシステムを作成する方法

序文システムにファイル システムを作成し、それを永続的または非永続的にマウントする方法を学習します。...

mysql 5.7.18 winx64 無料インストール設定方法

1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...