
La "vita'' dei file in un sistema GNU/Linux
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 3 di 10)
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\n”, 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\n”, 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\n” );
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: