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 ….

posté le 6. novembre 2009 à 3:38 pm par info · Permalink
Catégories : Administration système, Shell · Mots-clés: , ,

3 Réponses

Inscrivez-vous au fil RSS des commentaires

  1. Ecrit par Knah Tsaeb
    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.

  2. Ecrit par françois
    de 22/12/2010 à 4:42 pm
    Permalink

    OK, c’est corrigé !
    Merci pour la relecture.

  3. Ecrit par philv
    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.

Inscrivez-vous au fil RSS des commentaires

Ajoutez un commentaire