inotify / incron : Lancer une commande en cas d’action sur un fichier/un répertoire

By fhh 4 Comments

inotify”, Remplaçant de “dnotify”, est une technologie, intégrée au noyau Linux (>=2.6.13) , destinée à notifier les événements, modifications, accès, etc, effectués sur le contenu d’un système de fichiers en ce basant sur le contrôle des “inodes” (structures de données contenant des informations sur les fichiers d’un systèmes de fichiers).

incron“, Pour “INotify CRON”, permet d’exploiter les informations “d’inotify” afin d’effectuer une action, commande(s), scripts, etc, en cas de modifications de fichiers ou de répertoires donnés.

Installation

inotify” Est intégré au noyau et est activé dans les kernels fournis par les distributions.

incron” Est, de son côté, empaqueté sur la plupart des distributions mais nécessitera, sur Red Hat et ses dérivées (CentOS, Scientific Linux, etc) l’ajout des miroirs EPEL (“Extra Packages for Enterprise Linux” voir “Ajout des miroirs EPEL (Extra Packages for Enterprise Linux) sous Red Hat like (CentOS, RHEL, SL, …)” sur Admin Linux). L’installation s’effectue via le gestionnaire de paquet de votre distribution.

Sous Ubuntu, Debian et ses dérivés :

# apt-get install incron

Sous les dérivés de Red Hat :

# yum install incron

Sous Gentoo Linux “emerge” se chargera de l’installation tous comme “pacman” le fera très bien sous Arch Linux.

Configuration et utilisation

L’utilisation d’”incron” est calquée sur le fonctionnement de “cron”.

Fichiers de configuration

L’ensemble est configuré via les fichiers :

  • /etc/incron.conf : le fichier de configuration principal ;
  • /etc/incron.d/ : répertoire contenant la définition de fichiers/de répertoires à monitorer ;
  • /etc/incron.{allow,deny} : fichier définissant les utilisateurs autorisés à utiliser l’outil ;

Les fichiers de configurations sont largement commentés et explicites, nous ne nous étendrons pas dessus dans cet article. Pensez simplement à ajouter à “/etc/incron.allow” la liste des utilisateurs autorisés à utiliser l’outil.

mafalda ~ # cat /etc/incron.allow 
root

Ajout d’une entrée

Comme pour l’ajout d’une nouvelle entrée dans “cron” via “crontab -e”, une nouvelle entrée dans “incron” peut être ajoutée via “incrontab -e” ou par la création d’un fichier dans “/etc/incron.d/”.

Le format des entrées est de la forme :

<fichier/répertoire> <notification à vérifier> <commande et options>

Note : Le séparateur entre les champs est l’espace.

avec :

  • “<fichier/répertoire>” : le fichier ou le répertoire à surveiller ;
  • “<notification à vérifier>” : le type de modification engendrant l’exécution de la commande parmi (valeurs reprises du man d’inotify http://linux.die.net/man/7/inotify) :
    • IN_ACCESS : le fichier a été accédé (lecture) ;
    • IN_ATTRIB : les métadonnées du fichier ont été modifiées (permissions, timestamp, attributs étendus, etc) ;
    • IN_CLOSE_WRITE : fermeture d’un fichier avec écriture ;
    • IN_CLOSE_NOWRITE : fermeture d’un fichier sans écriture ;
    • IN_CREATE : fichier ou répertoire créé dans un répertoire surveillé ;
    • IN_DELETE : fichier ou répertoire supprimé dans un répertoire surveillé ;
    • IN_DELETE_SELF : le fichier ou répertoire surveillé est supprimé ;
    • IN_MODIFY : le fichier ou répertoire a été modifié ;
    • IN_MOVE_SELF : le fichier ou répertoire a été déplacé ;
    • IN_MOVED_FROM : un fichier du répertoire surveillé à été déplacé ;
    • IN_MOVED_TO : un fichier à été déplacé dans le répertoire surveillé ;
    • IN_OPEN : le fichier à été ouvert ;
    • IN_ALL_EVENTS : combinaison de tous ce qui précède.
    • IN_MOVE : équivalent à IN_MOVED_FROM ou IN_MOVED_TO ;
    • IN_CLOSE : équivalent à IN_CLOSE_WRITE ou IN_CLOSE_NOWRITE ;

    Plusieurs valeurs sont possibles séparées par des virgules.

  • “<commande et options>” : la commande à executer avec ses options ;

ATTENTION : incron n’est pas récursif ! Seules les modifications intervenues au premier niveau du répertoire surveillé seront détectées.

La commande peut utiliser un certain nombre de variables prédéfinies :

  • $@ : chemin complet du fichier/répertoire surveillé ;
  • $# : nom du fichier/répertoire sur lequel l’événement est intervenu ;
  • $% : nom (textuel) de l’événement intervenu ;
  • $& : numéro de l’événement intervenu.
  • $$ : le caractère dollar (“$”) ;

La page de man de “incrontab” (http://linux.die.net/man/5/incrontab) complétera ce descriptif.

Exemples

Re charger la configuration d’apache

Pour recharger la configuration d’apache après modification nous écririons :

/etc/apache2/apache2.conf IN_MODIFY /etc/init.d/apache2 reload
/etc/apache2/sites-enabled/ IN_MODIFY /etc/init.d/apache2 reload
/etc/apache2/conf.d/ IN_MODIFY /etc/init.d/apache2 reload

Chaque modification de l’un des fichiers/répertoires monitorés entraînera un “apache reload”.

Ce qui donne dans les logs :

Apr 24 19:01:41 srv incrond[17190]: (root) CMD (/etc/init.d/apache2 reload)

Note : si “incrond” lance plusieurs fois l’exécution de la commande voir “Les commandes sont exécutées plusieurs fois” dans la section “Problèmes” ci-dessous.

Recharger automatiquement les fichiers de zones dans bind

Le rechargement des fichiers de zones de bind (“/usr/sbin/rndc reload”) en cas de modification ce traduira par exemple par :

/etc/bind/zones/db.admin-linux.fr IN_MODIFY /usr/sbin/rndc reload


Problèmes

Comme dans la plupart des cas, pour déceler la provenance d’éventuels problèmes, reportez vous aux fichiers de logs de votre système.

Les commandes sont exécutées plusieurs fois

Si les commandes sont exécutées plusieurs fois lors de la modification d’un fichier, c’est peut être que le masque (le type d’événement surveillé) n’est pas tout à fait adapté.

Vous pouvez empêcher l’exécution multiple en ajoutant au masque l’option “IN_NO_LOOP” qui désactive la notification d’événement tant que la première commande lancée n’est pas terminée :

/root/data/inventaire.txt IN_MODIFY,IN_NO_LOOP /root/bin/inventory2dns

Impossible d’exécuter “incrontab”… que faire ?

Si lors de l’invocation “d’incrontab” vous obtenez un message de refus du type “not allowed” :

fhh@mafalda ~ $ incrontab -e
user 'fhh' is not allowed to use incron

c’est que l’utilisateur ne fait pas partie du fichier “/etc/incron.allow” :

mafalda ~ # cat /etc/incron.allow 
root

ajoutez le au fichier pour régler ce problème :

mafalda ~ # echo fhh >> /etc/incron.allow

Références

Inotify home page : http://inotify.aiken.cz/
NixCraft : http://www.cyberciti.biz/faq/linux-inotify-examples-to-replicate-directories/

Configuration, Outils, Sauvegardes, Scripts, Services

4 Comments to “inotify / incron : Lancer une commande en cas d’action sur un fichier/un répertoire”

  1. Serge says:

    Wow!

    J’ai cherché comment bien utiliser inotifywait à bien des endoits et c’est ici en français que j’ai trouvé la meilleure réponse, et de loin. Je vais pouvoir utiliser ceci en production!

    Je vais jeter un regard des plus intéressé sur ce site (et qui sait, si je trouve des choses que je maîtrise bien, contribuer?)…

    A+

    1. fhh says:

      Merci pour ce joli compliment :-) Les colonnes du site vous sont ouvertes quand vous le souhaitez, et toute contribution est la bienvenue (nous avons tous des sujets à partager ;-) )

  2. kouinkouin says:

    Hello,
    Super article. Je ne connaissais pas incron, et j’adore.
    Je m’étais déjà posé la question si ça existait sur Linux, mais je n’avais pas cherché plus loin.
    J’en profite pour saluer le reste du blog qui m’apprend des trucs-et-astuces depuis déjà ~1 an et demi ;)
    Bonne continuation ! :)

    1. fhh says:

      Merci pour ce retour d’un fidèle lecteur :) Le fait d’être ainsi suivi est encourageant (le site a été lancé en Octobre 2009… près de 3 ans déjà…). Hélas, je manque toujours de contributeurs :( D’ailleurs, vous êtes tous les bienvenus ;)

      “incron” est vraiment un bel outil, il lui manque juste l’aspect récursif pour être excellent…

Leave your Comment

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

 

Blue Taste Theme created by Jabox modified by FHH