linux shell : gérer les évènements iNotify
Avec la mise place du mécanisme mécanisme noyau iNotify, succédant à dNotify à partir de la version 2.16.13, le système GNU/linux se voit offerte la possibilité de pouvoir répondre en temps quasi-réel aux évènements intervenus sur un fichier particulier ou (et c’est nouveau) un répertoire.
En effet, une fois le mécanisme armé, le noyau va transmettre en espace utilisateur les évènements concernant, la création, la modification ou la suppression d’un fichier déterminé (ou portant sur des fichiers situés dans un répertoire donné).Pour ce qui concerne le shell, il faudra installer les outils correspondants en espace utilisateur, à savoir, pour une Debian, le paquet inotify-tools (sudo apt-get install inotify-tools fera le travail).
Ce paquet contient notamment les deux exécutables /usr/bin/inotifywait et /usr/bin/inotifywatch, accompagnés de leurs pages de man.
Si la commande inotifywatch arme le mécanisme noyau puis retourne un tableau récapitulant les évènements intervenus durant un temps déterminé sur un fichier ou, récursivement, sur un répertoire déterminé ; la commande inotifywait sera, quant à elle, plus utile dans l’optique de scripts shells permettant de gérer des modifications sur le système de fichiers : elle arme également le mécanisme de détection noyau puis se met en attente d’évènements, enfin pour chaque notification du noyau elle va émettre sur sa sortie standard une ligne de format paramétrable.
Par exemple, si l’on veut que la ligne émise comportant le type d’évènement et le nom du fichier concerné, séparés par un caractère ‘|’ (pipe), is suffira de passer à la commande inotifywait le paramètre –format « %e|%w%f », et on obtiendra les sorties suivantes :
CREATE|/home/user/tmp/monfic, sera affiché suite à la création d'un fichier monfic. MODIFY|/home/user/tmp/monfic, suite à la modification DELETE|/home/user/tmp/monfic, suite à la suppression ...
A partir de là, rien de plus simple pour scruter les évènements à intervenir qu’un script construit à partir du squelette ci-après :
#!/bin/bash inotifywait -m -r -e create -e delete -e moved_to -e modify --exclude ".*CVS.*" \ --format "%e|%w%f" /home/user/rep | while read res do event=`echo $res | sed s/\|.*$//` src=`echo $res | sed s/^.*\|//` case "$event" in CREATE) # Traitement sur création d'un fichier ;; CREATE,ISDIR) # Traitement sur création d'un répertoire ;; DELETE) # Traitement sur suppression d'un fichier ;; DELETE,ISDIR) # Traitement sur suppression d'un fichier ;; MOVED_TO) # Traitement sur déplacement d'un fichier ;; MODIFY) # Traitement sur modification d'un fichier ;; esac done
Concernant l’invocation de la commande inotifywait, le paramètre -r indique de scruter récursivement le répertoire indiqué, le paramètre -m passe la commande en mode monitoring, les paramètres -e sont les évènements à capturer, et le paramètre –exclude permet de fournir un motif de fichiers pour lesquels aucun évènement ne sera transmis.
Reste plus qu’à imaginer une utilité pour mettre tout celà en application ….
Catégories : Administration système, Shell · Mots-clés: évènements, inotify, Shell
de 22/12/2010 à 1:31 pm
Permalink
Juste pour signaler une petite faute de frappe :
modifiy => modify il y a un i
Merci pour ce petit bout de script, je le garde sous le coude.
de 22/12/2010 à 4:42 pm
Permalink
OK, c’est corrigé !
Merci pour la relecture.
de 29/12/2016 à 11:19 am
Permalink
Merci pour l’article tjrs d’actualité.
Suggestion pour éviter des créer des processus rien que pour extraire des chaînes de caractères des événements :
$ res= »CREATE|/home/user/tmp/monfic »
$ event=${res%|*}; echo $event
CREATE
$ src=${res#*|}; echo $src
/home/user/tmp/monfic
Petite faute d’orthographe : événement et non pas évènement.