lsof (開いているファイルのリスト) は、プロセスによって開かれたファイルを表示するツールです。 Linux では、すべてがファイルです。ファイルは、通常のデータだけでなく、ネットワーク接続やハードウェアへのアクセスも提供します。したがって、lsof コマンドは、プロセスによって開かれたファイルやディレクトリを表示できるだけでなく、プロセスがリッスンしているポートなどのソケット関連の情報も表示できます。この記事では、lsof コマンドの基本的な使い方を紹介します。この記事のデモ環境は Ubuntu 18.04 です。 共通オプション -aは他のオプションがAND関係にあることを示します 基本出力 オプションなしで lsof コマンドを実行すると、システム内のすべてのアクティブなプロセスによって開かれているすべてのファイルが出力されます。その結果、意味をなさない出力情報が大量に表示されます。まず、lsof コマンドで現在の Bash プロセスによって開かれたファイルを出力し、その結果の一部を傍受して、出力に含まれる情報を確認してみましょう。 コマンド: プログラムの名前 以下、FD 列と TYPE 列の共通内容について簡単に紹介します。 標準入力ファイルや標準出力ファイルなど、一部の 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 を持つファイルが出力されます。 指定した名前のプログラムによって開かれたファイルを表示する -c オプションを使用すると、プロセスを実行しているプログラム (実行可能ファイル) の名前を一致させることができます。たとえば、文字 cr で始まるプログラムによって開かれたファイルのリストを検索します。 $ sudo lsof -c cr 複数の -c オプションを同時に指定することもできます。それらの関係は OR です。 $ sudo lsof -c ^cr -c オプションは正規表現もサポートします。たとえば、次のコマンドは、cra および cro で始まるプログラムによって開かれたファイルを除外できます。 $ sudo lsof -c /cr[ao]/ 開かれたネットワーク関連ファイルを表示する -i オプションは、開かれたネットワーク関連ファイルを表示するために使用されます。パラメータの形式は次のとおりです。 -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 コマンドを使用してファイルを復元できます。具体的な原則は次のとおりです。 プロセスによって開かれたファイル記述子は、/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 は、マニュアルページの長さからもわかるように、単純なコマンドではありません。この記事で紹介した小さなデモから始めると、長いドキュメントを忘れて、段階的に使用を開始し、最終的にこのコマンドを習得できるようになります。 参照: 以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。 以下もご興味があるかもしれません:
|
<<: MySQL sql_modeの適切な設定に関する詳細な説明
>>: WeChat アプレット wxs 日付と時刻処理の実装例
背景アプリケーション システムの数が増え続けると、当初はアラームを発していなかったアクティブ スレッ...
この記事では主に基本的なチャットの実装方法を紹介します。今後は絵文字や写真のアップロードなどの機能も...
多くの Web ページにはナビゲーション バーに小さな三角形があり、この機能を実装するのは実は非常に...
前書き: position:sticky は CSS ポジショニングの新しい属性です。相対ポジショニ...
ウェブ上の一部の画像の src または CSS 背景画像 URL の後に、data:image/pn...
目次環境まとめモジュール機能関連文書ソースコード分析CCGame.js CCInputManager...
1. 行の形式は何ですか? MySQL の行形式の設定は次のように表示されます。 実際、MySQL ...
目次1. 問題2. 解決策オプション1:オプション2: 1. 問題この話は、エラーと脱落率を照会する...
この記事では、ショッピングカート決済機能を実現するためのVueの具体的なコードを例として紹介します。...
私が初めてdockerを使用したときは、dockerfileやdocker-composeを使用して...
最近、サーバー上のアカウントが2つハッキングされ、パスワードが改ざんされました。幸い、まだ使えるアカ...
ファイル操作に関連するシステムコール作成するint creat(const char *ファイル名,...
多くの場合、画像を表示する<a>タグのスタイルに遭遇しますが、タグ内にテキストがあり、そ...
序文システムにファイル システムを作成し、それを永続的または非永続的にマウントする方法を学習します。...
1. ダウンロード2. 減圧3. パス環境変数を追加し、mysqlが配置されているbinディレクトリ...