Je veux utiliser inotify pour surveiller les modifications du contenu d'un fichier. L'objectif est de lancer un script de vérification sémantique sur ce fichier et de les faire remonter aux admins via l’envoi d’un mail. Une erreur sémantique est une erreur qui ne plantera pas le démon/programme qui lit son fichier de conf’, mais qui empêchera d'atteindre le service attendu.
Pour ce faire, j'utilise incrond, donc j’ai ceci dans incrontab -e : <chemin_vers_fichier> IN_MODIFY <programme>
.
Ça fonctionne sur le vif, mais plus après quelques semaines… Je relance le démon avec service incron restart
. Ça fonctionne à nouveau… pour quelque temps seulement…
Explication : les éditeurs de texte en ligne de commande sérieux (vim, emacs, etc.) ne modifient jamais un fichier. L’événement inotify « IN_MODIFY » n’est donc jamais levé.
En effet, ils créent un fichier temporaire contenant le nouveau contenu puis ils déplacent ce fichier temporaire à l'emplacement du fichier visé par les modifications. L'objectif est de garantir l'absence de corruption du fichier modifié. En effet, mv (et l'appel système sous-jacent, rename) est la seule opération atomique sur un même système de fichiers : tant que le fichier reste au sein d'un même système de fichiers, mv consiste simplement à changer l'inode associé à un nom de fichier dans la liste des fichiers d'un dossier, et à virer l'ancienne entrée nom+inode.
Forcément, cette opération change l’inode (identifiant numérique d'un fichier dans la table des fichiers d'un système de fichiers) pointé par un nom de fichier dans la liste des fichiers d'un dossier. On peut vérifier cette hypothèse en exécutant un ls -lhi <fichier>
avant et après la modification. Cela fait qu’inotify n’émet plus d’événements pour ce fichier qui a disparu, donc mon script n'est pas lancé par incrond.
Solution :
Sans grande surprise, j’ai choisi la deuxième solution, donc ma ligne dans incrontab devient : <chemin_vers_fichier> IN_MODIFY,IN_MOVE_SELF <programme>
. « IN_MODIFY » pour surveiller les modifs effectuées à l'arrache (echo, redirection shell, nano, etc.) et « IN_MOVE_SELF » pour les autres modifs (vim, etc.).
Merci Gradator pour le rappel sur le comportement des "vrais" éditeurs de texte. :)