Ciò è dovuto al modo in cui stai utilizzando inotifywatche al modo in cui funziona lo strumento stesso. Quando corri inotifywatch -r /tmp, inizi a guardare /tmpe tutti i file che sono già in esso. Quando si crea un file all'interno /tmp, i metadati della directory vengono aggiornati per contenere il numero di inode del nuovo file, il che significa che la modifica avviene /tmpnon /tmp/test-1. Inoltre, poiché /tmp/test-1non era presente all'avvio inotifywatch, non è presente alcun inotifyorologio. Significa che qualsiasi evento che si verifica su un file creato dopo il posizionamento degli orologi non verrà rilevato . Potresti capirlo meglio se lo vedi da solo:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Se hai attivato il meccanismo di tracciamentoinotify_add_watch(2) , l'ultimo comando ti darà il numero di orologi impostati da inotifywatch. Questo numero dovrebbe essere uguale a quello dato da inotifywatchsolo. Ora, crea un file all'interno /tmpe controlla di nuovo:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Il numero non sarà aumentato, il che significa che il nuovo file non viene guardato. Si noti che il comportamento è diverso se si crea invece una directory:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Ciò è dovuto al modo in cui -rsi comporta l' interruttore :
-r, --recursive: [...] Se vengono create nuove directory all'interno delle directory controllate , verranno automaticamente guardate.
Edit: ho avuto un po 'confuso tra le due esempi, ma nel primo caso , gli orologi sono posizionati correttamente perché le chiamate degli utenti inotifywatchsu ~/*(che è espansa, vedere il commento di don_crissti qui ). Anche la home directory viene guardata perché ~/.*contiene ~/.. Teoricamente, dovrebbe anche contenere ~/.., che, combinato con l' -rinterruttore, dovrebbe comportare la visione dell'intero sistema.
Tuttavia, è possibile ottenere il nome del file che attiva un evento di creazione in una directory controllata, ma suppongo inotifywatchche non recuperi queste informazioni (viene salvato un po 'più in profondità del nome della directory). inotify-toolsfornisce un altro strumento, chiamato inotifywait, che può comportarsi in modo molto simile inotify-watch, e offre più opzioni di output (incluso %f, che è quello che stai cercando qui):
inotifywait -m --format "%e %f" /tmp
Dalla pagina man :
--format <fmt>Output in un formato specificato dall'utente, usando una sintassi simile a printf. [...] Sono supportate le seguenti conversioni:
%f: quando si verifica un evento all'interno di una directory, questo verrà sostituito con il nome del file che ha causato l'evento .
%e: sostituito con gli Eventi che si sono verificati, separati da virgola.
Inoltre, l' -mopzione (monitor) continuerà a inotifywaitfunzionare dopo il primo evento, che riprodurrà un comportamento abbastanza simile a quello di inotifywatch.
.bashrcnell'esempio @serverfaultnon appare nelle statistiche perché l'utente controlla ricorsivamente la sua directory home ma perchépath/.*è espanso e di conseguenza viene impostato un orologio per tutti i file. sottopath/(.bashrcincluso). Il comando utilizzato dall'OP non produrrà mai nomi di file perché gli orologi sono impostati per/tmped eventuali sottodirectory quindi le statistiche riguarderanno solo/tmpe le sue sottodirectory (cioè vedrai che i file sono stati raggiunti / spostati / ecc. Ma non ti diranno loro nomi).