Perché inotifywatch non rileva le modifiche sui file aggiunti?


14

Sto cercando di monitorare la mia /tmpcartella per le modifiche utilizzando inotifywatch:

sudo inotifywatch -v -r /tmp

Dopo aver creato un paio di file ( touch /tmp/test-1 /tmp/test-2), sto terminando inotifywatch(per Ctrl- Cche mi mostra le seguenti statistiche:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

L'output stampa solo le statistiche, ma non i file che mi aspettavo (come qui o qui ). Ho provato diversi tipi di accesso (via cat, mktempe così via), ma è la stessa cosa.

Ho dimenticato qualcosa? È perché sono su VPS e qualcosa è stato limitato?

Sistema operativo: Debian 7.3 (inotify-tools) su VPS

Risposte:


14

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.


1
.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. sotto path/( .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).
don_crissti,

@don_crissti Oops, ho confuso i due esempi forniti dall'OP. Ho modificato la mia risposta, grazie!
John WH Smith,

Grazie, è stato utile Ecco il mio comando per visualizzare il contenuto di tutti i file appena creati prova * in /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
Kenorb,

Inoltre: " Significa che qualsiasi evento che si verifica su un file creato dopo che sono stati posizionati gli orologi non verrà rilevato. " Qualsiasi evento (anche la creazione del file) verrà rilevato perché un orologio è già impostato per la directory di contenimento e questo è riflesso nelle statistiche per quella particolare directory. Vedi l' inotifywatchoutput nella domanda OP: i 2 createeventi ci sono (quindi vengono rilevati) ma dal momento che controlla inotifywatchuna directory (+ eventuali sottodirectory) le statistiche si riferiscono solo a quella / quelle directory.
don_crissti,

1
Non penso che siamo sulla stessa lunghezza d'onda qui ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.Inoltre, man inotifywatchè chiaro quali eventi sono stati guardati: EVENTS>> ... Un file guardato o un file all'interno di una directory controllata è stato visitato / chiuso / aperto / ecc. (significa includere eventi "che si verificano in un file" ). Gli eventi per un file creato dopo aver impostato l'orologio sulla directory principale verranno rilevati e riflessi nelle inotifywatchstatistiche (NON menzionerà per quali file si sono verificati quegli eventi).
don_crissti,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.