Comment surveiller les événements du système de fichiers sur les fichiers et les répertoires sous Linux
Inode notify (inotify) est un sous-système de Kenel Linux qui fournit des API pour surveiller les événements du système de fichiers. En plus de communiquer avec ces API à partir de langages de programmation appropriés, il est possible de tirer parti des fonctionnalités exposées en utilisant des outils de ligne de commande explicitement conçus tels que inotifywait, qui peuvent être facilement installés dans toutes les principales distributions Linux.
Dans ce tutoriel, nous voyons comment installer et utiliser l’utilitaire inotifywait pour surveiller les événements du système de fichiers sous Linux.
Dans ce tutoriel, vous allez apprendre :
- Comment installer inotifywait sur certaines des distributions Linux les plus utilisées
- Comment utiliser inotifywait pour surveiller les événements du système de fichiers sur les fichiers et les répertoires
- Comment surveiller un événement spécifique
Installation
L’utilitaire de ligne de commande inotifywait fait partie du paquet inotify-tools
, qui est disponible dans les dépôts officiels de toutes les principales distributions Linux. Pour installer le paquet sur Fedora et les distributions basées sur Fedora, nous exécutons :
$ sudo dnf install inotify-tools
Pour l’installer sur Debian et dérivés, nous pouvons utiliser la commande suivante :
$ sudo apt install inotify-tools
Le paquet est également disponible dans le dépôt Archilinux « Extra ». Nous pouvons le gestionnaire de paquets pacman
pour effectuer l’installation :
$ sudo pacman -Sy inotify-tools
Surveillance des événements du système de fichiers
L’utilitaire inotifywait
peut être utilisé pour attendre et réagir aux événements du système de fichiers. Dans l’utilisation la plus simple possible, nous invoquons l’utilitaire et passons le chemin du fichier ou du répertoire que nous voulons surveiller, en argument. Dans l’exemple ci-dessous, nous utilisons le fichier ~/.bash_profile
comme exemple :
$ inotifywait ~/.bash_profile
Setting up watches.
Watches established.
Lorsqu’il est exécuté de la manière dont nous l’avons fait ci-dessus, l’outil établit un watched sur le fichier spécifié et existe lorsque le premier événement se produit. À titre d’exemple, essayons de lire le contenu du fichier :
$ cat ~/.bash_profile
Dès que nous lançons la commande à partir d’une autre fenêtre du terminal, nous sommes notifiés d’un événement « OPEN » et inotify quitte :
/home/doc/.bash_profile OPEN
Si nous passons un chemin de répertoire en argument à la commande, tous les fichiers à l’intérieur dudit répertoire seront surveillés ; pas le contenu des sous-répertoires, cependant, puisque la commande, par défaut, n’est pas récursive. Pour changer ce comportement et surveiller toute une arborescence de répertoires, tout ce que nous avons à faire est d’utiliser l’option -r
(--recursive
). Lors de l’exécution de l’utilitaire de cette façon, nous pouvons avoir à augmenter le nombre maximum de montres autorisées, ce qui peut être fait en écrivant la valeur appropriée dans le fichier /proc/sys/fs/inotify/max_user_watches
. Notez toutefois que les modifications apportées au fichier ne sont pas conservées au redémarrage. Consultez ce tutoriel pour savoir comment les rendre permanents.
Écouter un événement spécifique
Dans certaines situations, il se peut que nous souhaitions être informés uniquement lorsqu’un événement spécifique se produit dans un fichier. Dans de tels cas, nous pouvons simplement utiliser l’option -e
(abréviation de --event
) et passer l’un des EVENTS pris en charge comme argument. En reprenant l’exemple précédent, pour surveiller uniquement les événements « modifier » sur le fichier ~/.bash_profile
, nous exécuterions :
$ inotifywait -e modify ~/.bash_profile
Comme nous n’écoutons que l’événement « modify », la commande continuera à fonctionner si nous lisons le contenu du fichier, mais nous avertira dès que nous tenterons d’écrire dessus, comme si nous ajoutions simplement du contenu :
$ echo "# This is just a comment" >> ~/.bash_profile
L’événement est notifié comme prévu :
/home/doc/.bash_profile MODIFY
Les événements que nous pouvons écouter sont signalés dans le tableau suivant, comme décrit dans le manuel de l’utilitaire :
- access
Un fichier surveillé ou un fichier d’un répertoire contrôlé a été lu.
- modify
Un fichier surveillé ou un fichier d’un répertoire contrôlé a été écrit.
- attrib
Les métadonnées d’un fichier surveillé ou d’un fichier dans un répertoire contrôlé ont été modifiées. Cela inclut les horodatages, les autorisations de fichiers, les attributs étendus, etc.
- close_write
Un fichier surveillé ou un fichier dans un répertoire surveillé a été fermé après avoir été ouvert en mode inscriptible. Cela n’implique pas nécessairement que le fichier a été écrit.
- close_nowrite
Un fichier surveillé ou un fichier dans un répertoire contrôlé a été fermé après avoir été ouvert en mode lecture seule.
- close
Un fichier surveillé ou un fichier dans un répertoire contrôlé a été fermé, quelle que soit la façon dont il a été ouvert. Notez que cela est en fait implémenté simplement en écoutant à la fois close_write et close_nowrite, donc tous les événements proches reçus seront affichés comme l’un des
\nceux-ci, pas PROCHE.- open
Un fichier surveillé ou un fichier dans un répertoire contrôlé a été ouvert.
- moved_to
Un fichier ou un répertoire a été déplacé dans un répertoire surveillé. Cet événement se produit même si le fichier est simplement déplacé depuis et vers le même répertoire.
- moved_from
Un fichier ou un répertoire a été déplacé d’un répertoire surveillé. Cet événement se produit même si le fichier est simplement déplacé depuis et vers le même répertoire.
- move
Un fichier ou un répertoire a été déplacé depuis ou vers un répertoire surveillé. Notez que cela est en fait implémenté simplement en écoutant à la fois moved_to et moved_from, donc tous les événements proches reçus seront affichés comme l’un ou les deux, et non MOVE.
- move_self
Un fichier ou un répertoire surveillé a été déplacé. Après cet événement, le fichier ou le répertoire n’est plus surveillé.
- create
Un fichier ou un répertoire a été créé dans un répertoire contrôlé.
- delete
Un fichier ou un répertoire d’un répertoire surveillé a été supprimé.
- delete_self
Un fichier ou un répertoire surveillé a été supprimé. Après cet événement, le fichier ou le répertoire n’est plus surveillé. Notez que cet événement peut se produire même s’il n’est pas explicitement écouté.
- unmount
Le système de fichiers sur lequel réside un fichier ou un répertoire surveillé a été démonté. Après cet événement, le fichier ou le répertoire n’est plus surveillé. Notez que cet événement peut se produire même s’il n’est pas explicitement écouté.
Écoute en mode « moniteur »
Dans les exemples précédents, nous avons vu comment, par défaut, une veille établie à l’aide de inotifywait existe dès qu’un des événements surveillés se produit.
\nSi nous voulons que la commande continue à écouter les événements, nous pouvons simplement utiliser l’option -m
, qui est la forme abrégée de --monitor
.
Dans l’exemple suivant, nous établissons une surveillance sur le fichier cible en mode moniteur, puis, nous lisons d’abord son contenu, puis, nous y ajoutons du contenu. Chaque opération implique trois événements, qui sont tous enregistrés :
$ inotifywait -m ~/.bash_profile
Setting up watches.
Watches established.
/home/doc/.bash_profile OPEN # The file is opened
/home/doc/.bash_profile ACCESS # The file is read
/home/doc/.bash_profile CLOSE_NOWRITE,CLOSE # The file is closed after being opened in read-only mode
/home/doc/.bash_profile OPEN # The file is opened
/home/doc/.bash_profile MODIFY # The file is modified (we appended content to it)
/home/doc/.bash_profile CLOSE_WRITE,CLOSE # The file is closed after being opened in writable mode
Exclusion des fichiers de la surveillance
Comme nous l’avons déjà dit, l’utilitaire inotifywait peut être utilisé pour écouter des événements sur des fichiers à l’intérieur d’un répertoire spécifié, ou sur une arborescence de répertoires entière. Dans de telles situations, nous pouvons éviter de surveiller des fichiers spécifiques, ou inclure explicitement certains d’entre eux. Pour accomplir de telles tâches, nous pouvons utiliser les options --exclude
et --include
, respectivement. Les deux prennent une expression régulière POSIX comme argument.
Dans l’exemple suivant, nous surveillons tous les fichiers du répertoire ~/.config
, à l’exception de ceux avec l’extension « .xml » :
$ inotifywait -m ~/.config --exclude ".*.xml"
Les options --include
et --exclude
correspondent aux expressions passées en mode sensible à la casse ; les deux, cependant, ont une variante qui fonctionne en mode insensible à la casse : --includei
et --excludei
, respectivement.
Conclusions
Dans ce tutoriel, nous avons appris comment installer le paquet inotify-tools sur certaines des distributions Linux les plus utilisées, et comment utiliser l’utilitaire de ligne de commande inotifywait pour surveiller les événements qui se produisent sur les fichiers et les répertoires.