私小さなスクリプト各プロセスの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
フィールドは、目的のファイル/ディレクトリを見つけるために必要な最終パスです。
メモ:inotify
in 行から取り出したメジャーとマイナーは/proc/*/fdinfo/*
16 進数で表示されますが、in はmountinfo
10 進数で表示されるため、 で検索する前に変換が必要ですmountinfo
。
メモ:の5番目のフィールドには、フィールド自体、または<space>、<newline>、<tab>文字がパスの一部である場合にエスケープされた8進数シーケンスをmountinfo
含めることができます。これは、スペースが、aなどでエンコードされることを意味します。たとえば、自分の指定子へのパスを指定してエスケープを解除できます。\
\
\040
\
\134
printf(1)
%b
メモ:名前空間(コンテナなど)を記述するには、find
マウント名前空間で最終コマンドを実行する必要があります。対象プロセスたとえば、(あなたの例では)次のようになります。
nsenter -mt 50679 find "$unescaped_path" -inum "$decimal_ino" -print -quit