Ich bin auf dieses Problem gestoßen, und keine dieser Antworten gibt Ihnen die Antwort "Wie viele Uhren verwendet jeder Prozess derzeit?" Die Einzeiler geben an, wie viele Instanzen geöffnet sind, was nur ein Teil der Geschichte ist, und das Trace-Zeug ist nur nützlich, um zu sehen, wie neue Uhren geöffnet werden.
TL; DR: Hiermit erhalten Sie eine Datei mit einer Liste der offenen inotify
Instanzen und der Anzahl der darin enthaltenen Überwachungen sowie den Pids und Binärdateien, die sie hervorgebracht haben, sortiert in absteigender Reihenfolge nach Anzahl der Überwachungen:
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
Das ist eine große Sauerei, also bin ich hierher gekommen. Um zu beginnen, habe ich tail
eine Testdatei ausgeführt und mir die FDS angesehen, die geöffnet wurden:
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
Also, 4 ist der fd, den wir untersuchen wollen. Mal sehen was drin ist 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
Das sieht aus wie ein Eintrag für die Uhr unten!
Versuchen wir etwas mit mehr Uhren, diesmal mit dem inotifywait
Hilfsprogramm, und schauen uns an, was auch immer drin ist /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
Aha! Weitere Einträge! Also sollten wir sechs Dinge in /tmp
dann haben:
joel@opx1:~$ ls /tmp/ | wc -l
6
Ausgezeichnet. Mein neuer inotifywait
hat einen Eintrag in seiner fd
Liste (was die anderen Einzeiler hier zählen), aber sechs Einträge in seiner fdinfo
Datei. So können wir herausfinden, wie viele Uhren ein bestimmter FD für einen bestimmten Prozess verwendet, indem wir seine fdinfo
Datei konsultieren . Um es nun mit einigen der oben genannten zusammenzufassen, greifen Sie auf eine Liste der Prozesse zu, bei denen Benachrichtigungsüberwachungen geöffnet sind, und verwenden Sie diese, um die Einträge in den einzelnen zu zählen fdinfo
. Das ist ähnlich wie oben, also werde ich den Einzeiler hier einfach wegwerfen:
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
Es gibt einige dicke Sachen hier, aber die Grundlagen sind, dass ich awk
einen fdinfo
Pfad von der lsof
Ausgabe aufbaue, die pid- und fd-Nummer greife und das u / r / w-Flag von letzterer abziehe. Dann fdinfo
zähle ich für jeden konstruierten Pfad die Anzahl der inotify
Zeilen und gebe die Anzahl und die PID aus.
Es wäre schön, wenn ich hätte, welche Prozesse diese Pids an der gleichen Stelle darstellen, nicht wahr? Ich dachte auch. Also, in einem besonders chaotisch Bit, ließ ich mich auf Aufruf dirname
zweimal auf dem fdinfo
Weg zu bekommen Pack /proc/<pid>
, das Hinzufügen /exe
zu, und dann laufen readlink
auf , dass den exe - Namen des Prozesses zu erhalten. Werfen Sie das auch hinein, sortieren Sie es nach der Anzahl der Uhren und leiten Sie es zur sicheren Aufbewahrung in eine Datei um. Wir erhalten:
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
Wenn ich das ohne sudo ausführe, um nur meine oben gestarteten Prozesse zu zeigen, erhalte ich:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
Perfekt! Eine Liste von Prozessen, FDS und wie viele Uhren jeder verwendet, genau das, was ich brauchte.
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print