Il file system è soggetto a mutamenti continui e in costante evoluzione ma il kernel sa sempre cosa accade e agisce di conseguenza. Scopri come
(pagina 2 di 10)
I simboli di Incron
Indispensabili per schedulare gli eventi
SIMBOLO
DESCRIZIONE
$$
Il carattere $
$@
La directory monitorata
$#
Il file a cui si riferisce l’evento
$%
I simboli che rappresentano l’evento (espressione testuale)
$&
I simboli che rappresentano l’evento (valore esadecimale)
I backend di logsend
Può utilizzare anche inotify
L’utility logsend può utilizzare vari programmi o servizi,
chiamati backend, per monitorare i file. Uno di questi è
appunto inotify che va quindi selezionato durante la fase di
configurazione.
Cominciamo con gli inotify-tools
Questo package raggruppa una libreria C++ che facilita la scrittura di
programmi di interfacciamento delle chiamate al kernel e due utility
particolarmente utili all’interno dei propri script: inotifywatch e inotifywait.
Per installarle entrambe occorre eseguire i seguenti comandi:
apt-get install libinotifytools0-dev
apt-get install inotify-tools
In breve, inotifywait ferma l’elaborazione finché non si verifica un
determinato evento su file o directory. Possiamo dire che è una sorta di
sleep condizionato da eventi su file o directory. Diversamente, inotifywatch
conta e categorizza gli eventi che in un determinato lasso di
tempo hanno coinvolto uno o più file o directory. Per i lettori più esperti
commentiamo, invece, il breve codice di esempio in linguaggio C
(directory ~/plus/Inotify), tratto dal sito di
inotify-tools (http://inotify-tools.sourceforge.net/api/inotifytools_8h.
html). Vanno inclusi i file header di inotify-tools con le dichiarazioni
delle funzioni di libreria:
#include
#include
Quella che segue, invece, è un’inizializzazione necessaria prima di ogni altra chiamata:
if ( !inotifytools_initialize() ) {
fprintf(stderr, “%s”, strerror(
inotifytools_error() ) );
return -1;
}
In pratica, tramite la funzione inotify_watch_recursively possiamo
creare un punto di monitoraggio indicando il file o la directory e i
relativi
eventi da controllare. Gli eventi sono quelli già definiti da inotify
e illustrati più avanti. Il programma in questione dovrà monitorare la
directory di esecuzione del programma e intercettare tutti gli eventi
possibili (IN_ALL_EVENTS):
if ( !inotifytools_watch_recursively( “.”, IN_ALL_
EVENTS ) ) {
fprintf(stderr, “%s”, strerror
( inotifytools_error() ) );
return -1;
}
Quello che segue, invece, è la definizione del formato per il timestamp dell’evento:
inotifytools_set_printf_timefmt( “%T” );
Ancora più avanti troviamo l’allocazione della struttura event in cui
verranno salvate tutte le informazioni relative all’evento accaduto. La
struttura sarà ritornata dalla funzione inotifytools_next_event, la quale
mette il programma in attesa del primo evento:
struct inotify_event * event = inotifytools_next_
event( -1 );
A questo punto, appena si verifica il primo evento si stampano le informazioni
ad esso relative, dopodiché il programma si mette in attesa del
prossimo evento all’interno di un ciclo senza fine:
while ( event ) {
inotifytools_printf( event, “%T %w%f %e” );
event = inotifytools_next_event( -1 );
}
Infine, per compilare e lanciare il programma bisogna eseguire i comandi seguenti:
gcc -oin_example -linotifytools in_example.c
./in_example
Se a questo punto in un altro terminale e sotto la stessa directory di lancio
del programma in_example eseguiamo il comando touch nome_
file, è possibile verificare che in_example restituisce istantaneamente
il seguente risultato:
12:51:43 ./nome_file CREATE
12:51:43 ./nome_file OPEN
12:51:43 ./nome_file ATTRIB
12:51:43 ./nome_file CLOSE_WRITE,CLOSE
A questo punto, è facile capire che il comando touch su un file che
non esiste ha scatenato quattro eventi prontamente restituiti da
inotify:
creazione, apertura, modifica degli attributi e chiusura del file.
Configurazione del backend utilizzato da logsend
Eventi di base
Le operazioni che è possibile eseguire sui file
PARAMETRO
DESCRIZIONE EVENTO
IN_ACCESS
Nuovo accesso al file/directory
IN_ATTRIB
Modifica degli attributi del file/directory
IN_CLOSE_WRITE
Chiusura di un file aperto in scrittura
IN_CLOSE_NOWRITE
Chiusura di un file aperto in lettura
IN_CREATE
Creazione di un nuovo file o di una cartella nella directory monitorata
IN_DELETE
Cancellazione di un file o di una directory nella directory monitorata
IN_DELETE_SELF
Cancellazione del file o della directory monitorata