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 日付と時刻処理の実装例
オフセットOffset はオフセットです。関連プロパティの offset シリーズを使用すると、次の...
レイアウトにul>liを使用した単一行レイアウトを以下に示します。 <ul class=...
最近、インターネットで「Build your own React」という記事を見ました。著者は、シン...
MySQL の漢字ソートの詳細な説明デフォルトでは、MySQL は日付、時刻、および英語の文字列の並...
目次序文🌟 1. APIの紹介2. 複数のデータソースの監視3. リスニングアレイ4. 監視対象5....
目次序文環境インストールMySQLコンテナを作成して起動する思い出させるMySQLコンテナコマンドを...
目次1. コンテンツの概要2. 文字セットと文字順序の概念と関係3. MySQL でサポートされてい...
袋を用意するインストールApacheがすでにインストールされているかどうかを確認するrpm -qa ...
Tomcat が自動的にサービスを開始するように設定します。最近、問題が発生しました。サーバー上のプ...
目次なぜパーティションが必要なのでしょうか?パーティショニング戦略パーティションの危険性なぜパーティ...
Windows 64ビットでのMySQLのインストールについて説明します。5.7以降、MySQLの...
1. はじめに少し前、開発者がテスト環境や本番環境で誤った操作をし、データベースを誤って削除/更新し...
1. MySQLのデフォルトストレージエンジンの変更MySQL 5.1 より前のバージョンでは、デフ...
目次Webコンポーネントカスタム要素概要HTMLTemplateElement コンテンツ テンプレ...
実行環境、Idea2020バージョン、Tomcat10、実行時にTomcat CatalinaLog...