Ho riscontrato questo problema e nessuna di queste risposte ti dà la risposta di "quanti orologi sta attualmente utilizzando ciascun processo?" Tutti i one-liner ti danno il numero di istanze aperte, che è solo una parte della storia, e la traccia è utile solo per vedere i nuovi orologi aperti.
TL; DR: questo ti porterà un file con un elenco di inotify
istanze aperte e il numero di orologi che hanno, insieme ai pid e ai binari che li hanno generati, ordinati in ordine decrescente in base al conteggio degli orologi:
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
È una grande palla di casino, quindi ecco come ci sono arrivato. Per iniziare, ho eseguito a tail
su un file di test e ho guardato i fd che si sono aperti:
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
Quindi, 4 è il fd che vogliamo investigare. Vediamo cosa c'è dentro fdinfo
per quello:
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
Sembra una voce per l'orologio in basso!
Proviamo qualcosa con più orologi, questa volta con l' inotifywait
utilità, solo guardando tutto ciò che è in /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! Altre voci! Quindi dovremmo avere sei cose /tmp
allora:
joel@opx1:~$ ls /tmp/ | wc -l
6
Eccellente. Il mio nuovo inotifywait
ha una voce nella sua fd
lista (che è ciò che contano le altre battute) qui, ma sei voci nel suo fdinfo
file. Quindi possiamo capire quanti orologi sta usando un dato fd per un dato processo consultando il suo fdinfo
file. Ora per metterlo insieme con alcuni dei precedenti per afferrare un elenco di processi che hanno aperto gli orologi di vigilanza e utilizzarlo per contare le voci in ciascuno fdinfo
. Questo è simile a quello sopra, quindi scaricherò qui il one-liner:
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
Ci sono alcune cose spesse qui, ma le basi sono che io uso awk
per creare un fdinfo
percorso lsof
dall'output, afferrando il numero pid e fd, togliendo la bandiera u / r / w da quest'ultimo. Quindi, per ogni fdinfo
percorso costruito , conto il numero di inotify
righe e produco il conteggio e il pid.
Sarebbe bello se avessi quali processi questi pid rappresentano nello stesso posto, giusto? Così ho pensato. Così, in un po 'particolarmente disordinato, ho optato per chiamare dirname
due volte sul fdinfo
percorso per arrivare a pacchetto /proc/<pid>
, aggiungendo /exe
ad esso, e quindi in esecuzione readlink
su che per ottenere il nome exe del processo. Aggiungilo anche lì, ordinalo per numero di orologi e reindirizzalo su un file per conservarlo in modo da ottenere:
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
Eseguendolo senza sudo per mostrare solo i miei processi che ho lanciato sopra, ottengo:
joel@gladstone:~$ cat watches
6 /proc/4906/fdinfo/3 /usr/bin/inotifywait
1 /proc/22734/fdinfo/4 /usr/bin/tail
Perfetto! Un elenco di processi, FD e quanti orologi ciascuno sta usando, che è esattamente quello di cui avevo bisogno.
find /proc/*/fd/* -type l -lname 'anon_inode:inotify' -print