私はこの問題にぶつかりましたが、これらの答えのどれも、「各プロセスが現在使用しているウォッチの数」という答えを提供しません。ワンライナーはすべて、開いているインスタンスの数を提供しますが、これはストーリーの一部にすぎず、トレースは、新しい時計が開かれているのを見るのにのみ役立ちます。
TL; DR:これにより、開いているinotify
インスタンスのリストと、それらが発生したウォッチの数、およびそれらを生成したpidとバイナリが、ウォッチカウントの降順にソートされたファイルが取得されます。
sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); exe=$(sudo readlink $(dirname $(dirname $fdi))/exe); echo -e $count"\t"$fdi"\t"$exe; done | sort -nr > watches
それは混乱の大きな玉なので、ここに私がそこに着いた方法があります。まずtail
、テストファイルでを実行し、開いているfdを確認しました。
joel@gladstone:~$ tail -f test > /dev/null &
[3] 22734
joel@opx1:~$ ls -ahltr /proc/22734/fd
total 0
dr-xr-xr-x 9 joel joel 0 Feb 22 22:34 ..
dr-x------ 2 joel joel 0 Feb 22 22:34 .
lr-x------ 1 joel joel 64 Feb 22 22:35 4 -> anon_inode:inotify
lr-x------ 1 joel joel 64 Feb 22 22:35 3 -> /home/joel/test
lrwx------ 1 joel joel 64 Feb 22 22:35 2 -> /dev/pts/2
l-wx------ 1 joel joel 64 Feb 22 22:35 1 -> /dev/null
lrwx------ 1 joel joel 64 Feb 22 22:35 0 -> /dev/pts/2
したがって、4は調査したいfdです。そのfdinfo
ために何があるのか見てみましょう:
joel@opx1:~$ cat /proc/22734/fdinfo/4
pos: 0
flags: 00
mnt_id: 11
inotify wd:1 ino:15f51d sdev:ca00003 mask:c06 ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:1df51500a75e538c
これは、下部の時計のエントリのように見えます!
今度はinotifywait
ユーティリティを使用して、より多くの時計で何かを試してみましょう/tmp
。
joel@gladstone:~$ inotifywait /tmp/* &
[4] 27862
joel@gladstone:~$ Setting up watches.
Watches established.
joel@gladstone:~$ ls -ahtlr /proc/27862/fd | grep inotify
lr-x------ 1 joel joel 64 Feb 22 22:41 3 -> anon_inode:inotify
joel@gladstone:~$ cat /proc/27862/fdinfo/3
pos: 0
flags: 00
mnt_id: 11
inotify wd:6 ino:7fdc sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:dc7f0000551e9d88
inotify wd:5 ino:7fcb sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:cb7f00005b1f9d88
inotify wd:4 ino:7fcc sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:cc7f00006a1d9d88
inotify wd:3 ino:7fc6 sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:c67f00005d1d9d88
inotify wd:2 ino:7fc7 sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:c77f0000461d9d88
inotify wd:1 ino:7fd7 sdev:ca00003 mask:fff ignored_mask:0 fhandle-bytes:8 fhandle-type:1 f_handle:d77f00000053c98b
あぁ!その他のエントリー!したがって、その時点で6つのことが必要/tmp
です。
joel@opx1:~$ ls /tmp/ | wc -l
6
優れた。私の新しいがinotifywait
あり1つの、その中のエントリfd
(ここでは、他のワンライナーがカウントされているものです)のリストが、その内6つのエントリfdinfo
ファイルを。そのため、fdinfo
ファイルを参照することで、特定のプロセスの特定のfdが使用しているウォッチの数を把握できます。次に、上記のいくつかと組み合わせて、ウォッチウォッチが開いていることを通知するプロセスのリストを取得し、それを使用して各のエントリをカウントしますfdinfo
。これは上記に似ているので、ここにワンライナーをダンプします。
sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); echo -e $count"\t"$fdi; done
ここにはいくつかの太いものがありますが、基本は、出力からパスawk
を構築し、pidとfd番号を取得し、後者からu / r / wフラグを削除することです。次に、構築されたパスごとに、行数をカウントし、カウントとpidを出力します。fdinfo
lsof
fdinfo
inotify
ただし、これらのpidがどのプロセスを同じプロセスで表すのかがあればいいですね。私はそうだと思いました。そのため、特に厄介な点で、packを取得するためにパスをdirname
2回呼び出して追加し、それを実行してプロセスのexe名を取得することに決めました。そこにもそれを投げ、時計の数でソートし、安全に保つためにファイルにリダイレクトすると、次のようになります:fdinfo
/proc/<pid>
/exe
readlink
sudo lsof | awk '/anon_inode/ { gsub(/[urw]$/,"",$4); print "/proc/"$2"/fdinfo/"$4; }' | while read fdi; do count=$(sudo grep -c inotify $fdi); exe=$(sudo readlink $(dirname $(dirname $fdi))/exe); echo -e $count"\t"$fdi"\t"$exe; done | sort -n > watches
上記で起動したプロセスを表示するためにsudo なしで実行すると、次のようになります:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
パーフェクト!プロセス、fd、およびそれぞれが使用しているウォッチの数のリスト。これはまさに必要なものです。
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print