J'ai rencontré ce problème et aucune de ces réponses ne vous donne la réponse suivante: "Combien de surveillances utilise actuellement chaque processus?" Les one-liners vous indiquent tous le nombre d' instances ouvertes, ce qui ne représente qu'une partie de l'histoire, et les informations de trace sont utiles uniquement pour voir les nouvelles alertes s'ouvrir.
TL; DR: vous obtiendrez un fichier avec une liste d' inotify
instances ouvertes et le nombre de leurs surveillances , ainsi que les pids et les binaires qui les ont générées, triés par ordre décroissant en fonction du nombre de surveillances:
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
C'est une grosse boule de bazar, alors voici comment je suis arrivé là. Pour commencer, j’ai exécuté un tail
fichier de test et jeté un coup d’œil au fd ouvert:
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
Donc, 4 est le fd que nous voulons étudier. Voyons ce qu'il y a dedans fdinfo
pour ça:
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
Cela ressemble à une entrée pour la montre en bas!
Essayons quelque chose avec plus de montres, cette fois avec l' inotifywait
utilitaire, en regardant ce qui se trouve dedans /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! Plus d'entrées! Nous devrions donc avoir six choses à ce moment- /tmp
là:
joel@opx1:~$ ls /tmp/ | wc -l
6
Excellent. Mon nouveau inotifywait
a une entrée dans sa fd
liste (c'est ce que comptent les autres on-line ici), mais six entrées dans son fdinfo
fichier. Nous pouvons donc déterminer combien de montres un fd donné utilise pour un processus donné en consultant son fdinfo
fichier. Maintenant, associez-le à certains des éléments ci-dessus pour obtenir une liste des processus qui ont ouvert les surveillances de notification et les utiliser pour compter les entrées de chacun fdinfo
. Ceci est similaire à ce qui est décrit ci-dessus, je vais donc vider le one-liner ici:
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
Il y a des choses épaisses ici, mais les bases sont celles que j'utilise awk
pour construire un fdinfo
chemin à partir de la lsof
sortie, en récupérant les numéros pid et fd, en supprimant le drapeau u / r / w de cette dernière. Ensuite, pour chaque fdinfo
chemin construit , je compte le nombre de inotify
lignes et affiche le nombre et le pid.
Ce serait bien si j'avais quels processus ces pids représentent au même endroit, n'est-ce pas? J'ai pensé ainsi. Ainsi, dans un peu particulier en désordre, je me suis installé à appeler dirname
deux fois sur le fdinfo
chemin pour obtenir paquet pour /proc/<pid>
, en ajoutant /exe
à, puis en cours d' exécution readlink
sur ce pour obtenir le nom exe du processus. Insérez-le également ici, triez-le par nombre de montres et redirigez-le dans un fichier afin de le conserver en sécurité et nous obtiendrons:
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
En exécutant cela sans sudo pour afficher uniquement les processus que j'ai lancés ci-dessus, je reçois:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
Parfait! Une liste des processus, des fd et du nombre de montres utilisées par chacun, ce qui est exactement ce dont j'avais besoin.
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print