Afficher/cacher Sommaire
URL: http://linuxfr.org/news/exploiter-inotify-c-est-simple Title: Exploiter inotify, c’est simple Authors: Denis Dordoigne Davy Defaud, palm123, NeoX, Bruno Michel, Benoît Sibaud et ZeroHeure Date: 2014-11-23T12:23:03+01:00 License: CC by-sa Tags: fichiers, notifications, surveillance, supervision et modification Score: 92
Intégré à partir de Linux 2.6.13, le mécanisme [[inotify]] permet de mettre en place des actions associées à l’évolution de l’état du système de fichiers. À l’occasion des 10 ans de ce projet, cette dépêche va vous donner des pistes pour exploiter ce mécanisme qui pourra vous simplifier bien des tâches d’administration.
Page Wikipédia inotify Documentation de incron Projet lsyncd Projet iwatch inotify-tools
#Description du fonctionnement Le mécanisme inotify permet de positionner un watch descriptor sur un fichier, qui enverra des notifications au système lorsque des événements affecteront le fichier suivi. Pour rappel, dans le monde UNIX, un fichier peut aussi bien représenter un fichier simple qu’un répertoire, un périphérique, un lien, etc. Les principaux événements qui peuvent être suivis sont :
- IN_ACCESS : le fichier est accédé en lecture ;
- IN_MODIFY : le fichier est modifié ;
- IN_ATTRIB : les attributs du fichiers sont modifiés ;
- IN_OPEN : le fichier est ouvert ;
- IN_CLOSE_WRITE : le fichier est fermé après avoir été ouvert en écriture ;
- IN_CLOSE_NOWRITE : le fichier est fermé après avoir été ouvert en lecture ;
- IN_MOVED_FROM / IN_MOVED_TO : le fichier a été déplacé ou renommé ;
- IN_DELETE_SELF : le fichier a été supprimé ;
- IN_DELETE : un fichier a été supprimé dans le répertoire surveillé ;
- IN_CREATE : un fichier a été créé dans le répertoire surveillé.
Dans le mécanisme standard de inotify, il n’y a pas de notion de récursivité : un événement dans /home/georgette/.ssh
ne sera pas remonté par un watch descriptor surveillant /home
; cependant, les outils implémentant inotify gèrent en général eux‐mêmes cette récursivité (en positionnant des watch descriptors dans toute l’arborescence, et en ajoutant dynamiquement des watch descriptors à chaque fois qu’un événement IN_CREATE survient).
Incron : mieux que des tâches planifiées, des tâches instantanées
## Principe ## Les administrateurs de systèmes GNU/Linux connaissent tous le gestionnaire de tâche planifié [[cron]], qui permet de lancer des tâches selon une planification cyclique (par exemple tous les dimanches à 14 h) définie dans une crontab, c’est‐à‐dire un fichier indiquant la tâche à exécuter et l’heure à laquelle elle doit être exécutée. Le logiciel incron reprend ce principe, mais, plutôt que de se baser sur des événements temporels, il se base sur des événements inotify.
## Installation ## Le logiciel incron est empaqueté par la plupart des distributions, il suffit donc de l’installer à l’aide de votre gestionnaire de paquets préféré :
# pour Debian, Ubuntu, etc.
$ apt-get install incron
# pour Red Hat, CentOS etc.
$ yum install incron
Une fois installé, il faut insérer les utilisateurs autorisés à utiliser incron dans le fichier /etc/incron.allow
:
$ cat /etc/incron.allow
httpadm
nagios
georgette
Utilisation
Pour créer une tâche dans la « incrontab », lancer la commande incrontab -e
, et y déclarer l’événement et la commande associée. Par exemple, on peut demander à lancer automatiquement la commande postalias
lorsque le fichier /etc/aliases
est modifié :
/etc/aliases IN_MODIFY postalias
Note : incron fait partie des logiciels qui n’implémentent pas la récursivité.
lsyncd : vers un système de fichiers distribué
Principe
Mettre en place un [[système de fichiers distribué]] peut s’avérer compliqué, puisque cela implique en général une phase de migration des données existantes dans un nouveau système de fichiers qu’il faut avoir installé sur de nouveaux disques, voire de nouveaux serveurs. Le logiciel lsyncd permet de simuler un système de fichiers distribué en synchronisant simplement les fichiers d’une arborescence, en utilisant [[rsync]]. L’avantage de lsyncd est que la synchronisation est faite à chaque modification, et dès que celle‐ci intervient : cela simule presque parfaitement un système de fichiers distribué synchrone
Mise en place
lsyncd est empaqueté pour la plupart des distributions GNU/Linux, il suffit donc de l’installer via votre gestionnaire de paquets habituel. La configuration se fait à l’aide de scripts en langage [[Lua]]. Si vous n’êtes pas habitué à utiliser ce langage, vous pouvez suivre les exemples donnés dans la documentation. Ici, on va synchroniser /var/www/mon_site
:
# cat /etc/lsyncd.conf.lua
-- configuration de lsyncd
settings{
statusFile = "/tmp/lsyncd.stat",
statusInterval = 1,
insist = 1,
inotifyMode = "CloseWrite or Modify",
}
-- liste des serveurs vers lesquels synchroniser
targetlist = {
"web01::mon_site",
"web02::mon_site",
"web03::mon_site"
}
-- configuration de la synchronisation
for _, server in ipairs(targetlist) do
sync{ default.rsync,
source="/var/www/mon_site",
target=server
}
end
Pour que la synchronisation fonctionne, il faudra bien évidemment configurer [[rsync]] sur les serveurs web01, web02 et web03 pour que la destination mon_site pointe vers /var/www/mon_site
.
# iwatch : ceci n’est pas une montre #
Le logiciel iwatch permet de déclencher une action suite à un événement inotify. Il s’agit d’un logiciel destiné à l’origine à la surveillance, on s’en sert donc habituellement pour envoyer un courriel lorsqu’un fichier est modifié. Par exemple, pour prévenir Georgette de chaque modification de /etc/shadow
:
iwatch -m georgette@example.com /etc/shadow
Contrairement à incron, iwatch gère la récursivité (avec l’option -r
) et les exclusions (avec l’option -x
pour un chemin, et -X
pour une [[expression rationnelle]]), par exemple pour lancer l’antivirus pour chaque modification dans /var/www/upload
(ou un de ses sous‐répertoires) sauf des fichiers .png
:
iwatch -r -X '\.png$' -c "clamscan %f" /var/www/upload
Ici, %f pointe vers le fichier ayant déclenché l’événement.
inotify-tools : mettez de l’inotify dans votre ligne de commande
Les inotify-tools permettent de faire des appels inotify directement en ligne de commande, quel que soit le shell utilisé.
inotifywait
La première commande fournie est inotifywait, qui permet d’attendre un événement avant de continuer une exécution, par exemple pour éviter qu’une commande ayant un fichier en prérequis tombe en erreur :
inotifywait -e close_write /var/run/jboss.pid && supervision_jboss.sh
L’option -t
(timeout) permet de mettre en place un délai d’expiration en secondes pour, par exemple, sortir en erreur si un événement est trop long à arriver :
sauvegarde.sh & ; inotifywait -e close_write -t 10000 rapport_sauvegarde || killall sauvegarde.sh
inotifywatch
La commande inotifywatch permet de faire un rapport d’activité des événements concernant les répertoires surveillés :
$ inotifywatch /var/cache/apt/archives &
[1] 18607
root@kamoulix:~# Establishing watches...
Finished establishing watches, now collecting statistics.
root@kamoulix:~# apt-get autoclean
root@kamoulix:~# kill %1
total access close_write close_nowrite open delete filename
1919 7 1 2 3 1906 /var/cache/apt/archives/
Par défaut, inotifywatch s’arrêtera après avoir un reçu un signal d’interruption. On peut aussi le faire tourner juste pour un certain nombre de secondes avec l’option -t
, par exemple pour voir l’activité du répertoire home de l’utilisateur georgette pendant une minute :
$ inotifywatch -r /home/georgette/ -t 20
Establishing watches...
Finished establishing watches, now collecting statistics.
total access modify close_write close_nowrite open moved_from moved_to create filename
16 3 3 2 0 2 2 2 2 /home/georgette/.mozilla/firefox/e3lq4lm3.default/
13 11 0 0 1 1 0 0 0 /home/georgette/.cache/myapp/mycache/
# Codez avec inotify # Les principaux langages de programmation proposent une bibliothèque pour travailler avec inotify, en voici une liste non exhaustive :
- en Perl : Linux::Inotify, Linux::Inotify2, POEx::Inotify, etc. ;
- en Python : pyinotify, inotifyx, pollinotify, etc. ;
- en Ruby : rb-inotify, inotify, ruby-inotify, etc. ;
- en PHP : l’extension PECL inotify ;
- en Java : JNotify pour faire simple, ou développer sa propre classe.