|
|
| Line 1: |
Line 1: |
| {{Stub}}
| | *[[Introduzione a inotify]] |
| | | *[[Monitorare la presenza di files con incron tramite inotify]] |
| inotify è un sottosistema del kernel di Linux che agisce per estendere le funzionalità del filesystem per notare dei cambiamenti nel filesystem, e segnalare le modifiche alle applicazioni. Esso sostituisce il precedente, dnotify, che aveva obiettivi simili.
| |
| | |
| Gli sviluppatori originali di inotify furono John McCutchan, Robert Love e Amy Griffis. E’ stato incluso nel kernel Linux dalla versione 2.6.13 (18 giugno 2005), e poteva essere compilato nel 2.6.12 e, eventualmente, in versioni precedenti con l’uso di una patch.
| |
| | |
| | |
| | |
| Un utilizzo è nel settore dei servizi di ricerca da desktop come Beagle, dove la sua funzionalità permette la reindicizzazione dei file modificati, senza dover eseguire la scansione del file system per cercare modifiche ogni pochi minuti, il che sarebbe molto inefficiente. Essendo informato che un file è stato modificato direttamente dal kernel, piuttosto che cercando attivamente, Beagle e strumenti simili possono ottenere tempi di cambio e reindicizazzione di solo circa un secondo.
| |
| | |
| | |
| | |
| <ins><ins></ins></ins>
| |
| | |
| | |
| | |
| Può anche essere utilizzato per aggiornare automaticamente le viste delle directory, ricaricare i file di configurazione, i cambiamenti nei file di log, fare backup, sincronizzare o upload.
| |
| | |
| | |
| | |
| '''Esempi nella Shell'''
| |
| Per utilizzare la potenza di inotify è necessario installare il pacchetto '' [http://inotify-tools.sourceforge.net/ inotify-tools] '' (disponibile per tutte le principali distribuzioni), dopo di che è possibile utilizzare il comando “inotifywait”, una funzione che lo rende facile da integrare con il script di shell.
| |
| | |
| | |
| | |
| '''inotifywait'''
| |
| Questo comando semplicemente si blocca in attesa di eventi da inotify , il che lo rende appropriato per l’uso in script di shell. E’ possibile guardare qualsiasi insieme di file e directory, e può ricorsivamente guardare interi alberi di directory.
| |
| | |
| | |
| | |
| '''Esempio 1
| |
| '''
| |
| | |
| | |
| | |
| <code>
| |
| #!/bin/sh</code>
| |
| | |
| | |
| | |
| <code># get the current path
| |
| CURPATH=`pwd`</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| <code>inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
| |
| -e close_write /tmp/test | while read date time dir file; do</code>
| |
| | |
| | |
| | |
| <code>FILECHANGE=${dir}${file}
| |
| # convert absolute path to relative
| |
| FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`</code>
| |
| | |
| | |
| | |
| <code>rsync --progress --relative -vrae 'ssh -p 22' $FILECHANGEREL usernam@example.com:/backup/root/dir && \
| |
| echo "At ${time} on ${date}, file $FILECHANGE was backed up via rsync"
| |
| done</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| In questo esempio controlliamo /tmp/test e se un evento di “close_write” e’ colto allora eseguiamo uni rsync di quel file in una posizione remota.
| |
| | |
| | |
| | |
| '''Esempio 2
| |
| '''
| |
| Considerate il semplice esempio di voler monitorare la directory /tmp e stampare un messaggio ogni votla che un file viene aggiunto.
| |
| | |
| | |
| | |
| <code>
| |
| #!/bin/sh</code>
| |
| | |
| | |
| | |
| <code># CONFIGURATION
| |
| DIR="/tmp"
| |
| EVENTS="create"
| |
| FIFO="/tmp/inotify2.fifo"</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| <code># FUNCTIONS
| |
| on_exit() {
| |
| kill $INOTIFY_PID
| |
| rm $FIFO
| |
| exit
| |
| }</code>
| |
| | |
| | |
| | |
| <code>on_event() {
| |
| local date=$1
| |
| local time=$2
| |
| local file=$3</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| <code>sleep 5</code>
| |
| | |
| | |
| | |
| <code>echo "$date $time Fichier créé: $file"
| |
| }</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| <code># MAIN
| |
| if [ ! -e "$FIFO" ]
| |
| then
| |
| mkfifo "$FIFO"
| |
| fi</code>
| |
| | |
| | |
| | |
| <code>inotifywait -m -e "$EVENTS" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %f' "$DIR" > "$FIFO" &
| |
| INOTIFY_PID=$!</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| <code>trap "on_exit" 2 3 15</code>
| |
| | |
| | |
| | |
| <code>while read date time file
| |
| do
| |
| on_event $date $time $file &
| |
| done < "$FIFO"</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| <code>on_exit</code>
| |
| | |
| | |
| | |
| <code> </code>
| |
| | |
| | |
| | |
| Dettagli:
| |
| | |
| * La funzione on_event viene lanciata in background (un sub-processo di shell è effettivamente creato) | |
| * Le operazioni sono eseguite in elaborazione parallela pratico per multi-processori
| |
| * Con l’uso della named pipe $FIFO è possibile eseguire il comando inotifywait in background ed ottenere il suo PID
| |
| * E ‘ possibile installare una “trap”, cioè la on_exit function () “, che uccide il comando inotifywait (ed elimina la named pipe) quando lo script è ucciso con i segnali 2 (INT ), 3 (QUIT) or 15 (TERM)
| |
| * Gli eventi vengono effettuati attraverso la named pipe, senza creare una shell, attraverso la fine del “while” done <$ FIFO
| |
| | |
| '''Stai “inotified”'''
| |
| | |
| | |
| | |
| Ci sono molte utilità basate su inotify da considerare in aggiunta al vostro bagaglio di trucchi. L’utilità incron è un corollario di cron, ma reagisce agli eventi inotify invece di una pianificazione temporale. L’utilità inoticoming è specificamente progettato per monitorare dropboxes. E se sei uno sviluppatore Perl, Ruby, Python o, si possono trovare moduli e librerie per chiamare inotify dalla comodità della vostra lingua preferita di scripting.
| |
| | |
| | |
| | |
| For instance, Perl coders can use Linux::Inotify2 (see Resources for details) to embed inotify features in any Perl application.
| |
| | |
| | |
| | |
| This code, taken from the Linux::Inotify2 README file, demonstrates a callback interface to monitor events:
| |
| | |
| | |
| | |
| <code>
| |
| use Linux::Inotify2;</code>
| |
| | |
| | |
| | |
| <code>my $inotify = new Linux::Inotify2
| |
| or die "Unable to create new inotify object: $!";</code>
| |
| | |
| | |
| | |
| # for Event:
| |
| Event->io (fd =>$inotify->fileno, poll => 'r', cb => sub { $inotify->poll });
| |
| | |
| | |
| | |
| # for Glib:
| |
| add_watch Glib::IO $inotify->fileno, in => sub { $inotify->poll };
| |
| | |
| | |
| | |
| # manually:
| |
| 1 while $inotify->poll;
| |
| | |
| | |
| | |
| # add watchers
| |
| $inotify->watch ("/etc/passwd", IN_ACCESS, sub {
| |
| my $e = shift;
| |
| my $name = $e->fullname;
| |
| print "$name was accessed\n" if $e->IN_ACCESS;
| |
| print "$name is no longer mounted\n" if $e->IN_UNMOUNT;
| |
| print "$name is gone\n" if $e->IN_IGNORED;
| |
| print "events for $name have been lost\n" if $e->IN_Q_OVERFLOW;
| |
| | |
| | |
| | |
| <code> # cancel this watcher: remove no further events
| |
| $e->w->cancel;
| |
| });
| |
| </code>
| |
| | |
| | |
| | |
| Riferimenti:
| |
| | |
| | |
| | |
| http://kerlinux.org/2010/08/utilisation-de-inotifywait-dans-des-scripts-shell/
| |
| | |
| http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/index.html?ca=drs-
| |
| | |
| *[http://www.linuxaria.com/article/introduction-inotify?lang=it Linuxaria introduzione a inotify : Linuxaria]
| |