Come monitorare continuamente la directory usando il comando dnotify / inotify

Sono nuovo nel comando dnotify / inotify. Qualcuno può aiutarmi a scrivere uno script in modo tale da monitorare continuamente una directory e indicare che c’è qualche modifica o modifica ad esso.

Inotify stesso è un modulo del kernel accessibile tramite chiamate, ad esempio, da un programma C. http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Esiste una suite di applicazioni chiamata inotify-tools, che contiene:

inotifywait: attendere le modifiche ai file utilizzando inotify

http://linux.die.net/man/1/inotifywait

e

inotifywatch – raccoglie le statistiche di accesso al filesystem usando inotify

http://linux.die.net/man/1/inotifywatch

È ansible utilizzare inotify direttamente dalla riga di comando, ad esempio in questo modo per monitorare continuamente tutte le modifiche nella directory home (potrebbe generare un sacco di output):

inotifywait -r -m $HOME 

Ed ecco uno script che monitora continuamente e reagisce all’attività del registro di Apache, copiata dal file man di inotifywait:

 #!/bin/sh while inotifywait -e modify /var/log/messages; do if tail -n1 /var/log/messages | grep httpd; then kdialog --msgbox "Apache needs love!" fi done 

Di seguito è riportato ciò che utilizzo per visualizzare le operazioni su un singolo file. “-m” causa il monitoraggio e l’uscita dopo un solo evento. Per ottenere i timestamp, è necessaria la versione 3.13 di inotify-tools, ma se ciò non è importante (o non è disponibile sul tuo sistema operativo o difficile da aggiornare) puoi saltare le opzioni timefmt e format. “cat /etc/resolv.conf” in un’altra shell porta ai risultati seguenti:

 $ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' /etc/resolv.conf Setting up watches. Watches established. 12:49 /etc/resolv.conf OPEN 12:49 /etc/resolv.conf ACCESS 12:49 /etc/resolv.conf CLOSE_NOWRITE,CLOSE 

inotifywait ha anche opzioni per il monitoraggio delle directory, quindi controlla la manpage. Aggiungi -r per ricorsivo per monitorare i figli di una dir.

Ecco un esempio con i comandi che ho digitato in una finestra diversa mostrata con il prefisso “->”:

 $ inotifywait -mr --timefmt '%H:%M' --format '%T %w %e %f' /home/acarwile/tmpdir Setting up watches. Beware: since -r was given, this may take a while! Watches established. -> cd into directory, no info -> ls in directory 13:15 /home/acarwile/tmpdir/ OPEN,ISDIR 13:15 /home/acarwile/tmpdir/ CLOSE_NOWRITE,CLOSE,ISDIR -> touch newfile 13:16 /home/acarwile/tmpdir/ CREATE newfile 13:16 /home/acarwile/tmpdir/ OPEN newfile 13:16 /home/acarwile/tmpdir/ ATTRIB newfile 13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE newfile -> mv newfile renamedfile 13:16 /home/acarwile/tmpdir/ MOVED_FROM newfile 13:16 /home/acarwile/tmpdir/ MOVED_TO renamedfile -> echo hello >renamedfile 13:16 /home/acarwile/tmpdir/ MODIFY renamedfile 13:16 /home/acarwile/tmpdir/ OPEN renamedfile 13:16 /home/acarwile/tmpdir/ MODIFY renamedfile 13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile -> touch renamedfile 13:17 /home/acarwile/tmpdir/ OPEN renamedfile 13:17 /home/acarwile/tmpdir/ ATTRIB renamedfile 13:17 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile -> rm renamedfile 13:17 /home/acarwile/tmpdir/ DELETE renamedfile -> cd ..; rmdir tmpdir 13:17 /home/acarwile/tmpdir/ DELETE_SELF 

Dopo quanto sopra, ho provato a rifare il tmpdir (“mkdir tmpdir”) ma non ho ottenuto alcun risultato da quello. Il nuovo tmpdir non è la stessa directory del vecchio tmpdir. E ‘tempo di solo ^ C e fermati itnotifywait.

Come ho detto su https://superuser.com/a/747574/28782 , ho creato uno script di supporto che utilizza inotifywait senza alcune delle sue limitazioni dirette: inotifyexec

Esempio di utilizzo (supponendo che tu l’abbia aggiunto nel tuo percorso di sistema come eseguibile):

 inotifyexec "echo test" -r .