「inotify」インスタンスで監視中のファイルのリスト

「inotify」インスタンスで監視中のファイルのリスト

小さなスクリプト各プロセスのinotifyモニターの数をリストします。通常これを行うと、私が欲しいものを得ることができますが、今は不思議です。どのファイルが監視されています。私はこれが可能だと思います。イノティファイウォッチinotifyインスタンスが監視しているファイルに対応していますか?

私も考える現在、そのスクリプトの内容に基づいてビルドできます。例えば、

sudo find /proc/*/fd -lname anon_inode:inotify  | cut -d "/" -f 3

inotifyファイル記述子を使用してプロセスのリストを取得します。ファイル記述子の1つに関する情報を見ると、ファイルハンドル/関心リストであると仮定するものが得られます。

$ sudo cat /proc/50679/fdinfo/19
pos:    0
flags:  00
mnt_id: 15
inotify wd:8 ino:640001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01006400feaad211
inotify wd:7 ino:a08da sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:da080a0094019e8f
inotify wd:6 ino:840003 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:030084005ae9e3df
inotify wd:5 ino:840002 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:020084000d506c1f
inotify wd:4 ino:840001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01008400e47bab26
inotify wd:3 ino:32004e sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:4e003200488122df
inotify wd:2 ino:320001 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:01003200545a9f32
inotify wd:1 ino:2 sdev:800001 mask:3cc ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:0200000000000000

f_handle:01003200545a9f32そのファイルを見つけて、デフォルトでf_handle/proc/../fdinfo/のaをファイル名に変換できたらと思います。

答え1

私はこの領域を処理するための標準ツールを知りませんf_handle。これはシステムコールに便利ですopen_by_handle_at(2)が、フィールドが常に有効なわけではありません。たとえば、カーネルはnfsdこれを提供しません。

ただし、Linuxでは、すべてのファイルの完全な座標は、まだsdevフィールドinoに報告されている古いデバイス番号とinode番号です。それはそれらを解読する問題です。

どちらの値も(現在)16進表記で表されます。inoそのままにして10進表現に変換するだけです。

sdev 一方、値を従来の「メインおよびマイナー」デバイス番号に分割する必要があるため、いくつかのデコードが必要です。物理ブロックデバイスでサポートされていないファイルシステム上のファイルにも、sdevこのフィールドに報告される一意の擬似デバイス番号があります。

sdevフィールドが数字を表現するために(8の代わりに)20ビットを使用するLinuxが「巨大なエンコーディング」と呼ばれる方法に従ってエンコードされると仮定すると、ビット単位の主な数字はであり、sdev >> 20数字はですsdev & 0xfffff。または、プレーンテキスト操作方法を使用すると、マイナー番号は最も右(最大)5桁の16進数であり、メジャー番号は最後の5桁の16進数の前のすべての数字です。 16進数が5個未満の場合、主な番号はです0

専攻と不専攻を取得した後、対象プロセス文書mountinfo。あなたの場合はです。具体的には、次のペアのある行を/proc/50679/mountinfo探します。major:minor第三大地。行を見つけたfindフィールドは、目的のファイル/ディレクトリを見つけるために必要な最終パスです。

メモ:inotifyin 行から取り出したメジャーとマイナーは/proc/*/fdinfo/*16 進数で表示されますが、in はmountinfo10 進数で表示されるため、 で検索する前に変換が必要ですmountinfo

メモ:の5番目のフィールドには、フィールド自体、または<space>、<newline>、<tab>文字がパスの一部である場合にエスケープされた8進数シーケンスをmountinfo含めることができます。これは、スペースが、aなどでエンコードされることを意味します。たとえば、自分の指定子へのパスを指定してエスケープを解除できます。\\\040\\134printf(1)%b

メモ:名前空間(コンテナなど)を記述するには、findマウント名前空間で最終コマンドを実行する必要があります。対象プロセスたとえば、(あなたの例では)次のようになります。

nsenter -mt 50679 find "$unescaped_path" -inum "$decimal_ino" -print -quit

関連情報