Introduzione a inotify
| Attenzione questo articolo è ancora incompleto. Sentiti libero di contribuire cliccando sul tasto edit. |
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.
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 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
- !/bin/sh
- get the current path
CURPATH=`pwd`
inotifywait -mr --timefmt '%d/%m/%y %H:%M' --format '%T %w %f' \
-e close_write /tmp/test | while read date time dir file; do
FILECHANGE=${dir}${file}
- convert absolute path to relative
FILECHANGEREL=`echo "$FILECHANGE" | sed 's_'$CURPATH'/__'`
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
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.
- !/bin/sh
- CONFIGURATION
DIR="/tmp"
EVENTS="create"
FIFO="/tmp/inotify2.fifo"
- FUNCTIONS
on_exit() {
kill $INOTIFY_PID
rm $FIFO
exit
}
on_event() {
local date=$1
local time=$2
local file=$3
sleep 5
echo "$date $time Fichier créé: $file"
}
- MAIN
if [ ! -e "$FIFO" ]
then
mkfifo "$FIFO"
fi
inotifywait -m -e "$EVENTS" --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %f' "$DIR" > "$FIFO" &
INOTIFY_PID=$!
trap "on_exit" 2 3 15
while read date time file
do
on_event $date $time $file &
done < "$FIFO"
on_exit
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:
use Linux::Inotify2;
my $inotify = new Linux::Inotify2
or die "Unable to create new inotify object: $!";<
- 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;
- cancel this watcher: remove no further events
$e->w->cancel;
});