Ce guide vous expliquera comment tirer parti des notifications du système de fichiers Linux, plus précisément « inotify », pour être averti instantanément de l’arrivée de nouveaux fichiers dans un dossier. Cette fonctionnalité peut servir de déclencheur pour automatiser diverses opérations sur votre machine.
Nous allons élaborer un script qui surveille un répertoire spécifique et exécute une action dès qu’un nouveau fichier est détecté. Chaque fichier sera compressé en format gzip et déplacé vers un autre répertoire. Le script utilise le sous-système inotify, en utilisant l’utilitaire nommé inotify-tools. Mais commençons par installer cet outil et l’explorer.
Installation de inotify-tools et gzip
Si vous utilisez Ubuntu ou une autre distribution basée sur Debian, employez la commande apt-get pour installer ces paquets. Sur les autres distributions Linux, utilisez l’outil de gestion de paquets propre à votre distribution.
sudo apt-get install inotify-tools gzip
Expérimentation avec inotify
Commençons par observer un dossier et les événements déclenchés lors de l’arrivée de nouveaux fichiers. Nous utiliserons l’utilitaire inotifywatch, inclus dans inotify-tools. Créez d’abord un nouveau répertoire nommé « entrants » :
mkdir entrants
Commencez la surveillance de ce dossier avec la commande suivante :
inotifywatch -v entrants
Cette commande demande à inotify de surveiller tous les événements du système de fichiers dans le répertoire « entrants ». L’option -v permet d’afficher des informations plus détaillées. Sans option de délai (-t), la commande collectera les événements jusqu’à ce que nous l’arrêtions avec CTRL+C. À ce stade, votre terminal devrait afficher quelque chose de similaire :
Ouvrez une nouvelle fenêtre ou un nouvel onglet de terminal et naviguez dans le répertoire entrants. Utilisez la commande touch pour créer un fichier appelé « nouveau_fichier ».
cd entrants/ touch nouveau_fichier
Retournez à la première fenêtre du terminal et stoppez inotifywatch avec CTRL+C.
Un tableau d’événements sera affiché, listant les actions « create », « open », « attrib » et « close_write ». Ces quatre actions ont eu lieu lorsque nous avons utilisé touch pour créer le fichier, définir ses attributs d’accès, l’ouvrir pour écrire un caractère de fin nul, puis le fermer. Ce ne sont que quelques-uns des nombreux événements que l’on peut surveiller avec inotify-tools. La liste complète est disponible sur la page de manuel de inotifywatch.
Pour notre script, nous ne nous intéresserons qu’à deux événements :
« create » – quand un fichier est créé dans le dossier cible.
« moved_to » – quand un fichier est déplacé depuis un autre emplacement vers le dossier cible.
Réessayons inotifywatch, mais cette fois en demandant de surveiller uniquement ces deux événements. Exécutez cette commande dans la première fenêtre du terminal :
inotifywatch -v -e create -e moved_to entrants
Dans la deuxième fenêtre ou onglet du terminal, tentons de créer un fichier, d’en modifier le contenu, puis de déplacer un fichier depuis un autre emplacement vers le dossier cible. Toutes ces commandes sont exécutées depuis le répertoire personnel.
touch entrants/cree echo Test123 >> entrants/cree touch /tmp/cree2 mv /tmp/cree2 entrants/
Retournez à la première fenêtre du terminal et stoppez inotifywatch avec CTRL+C. Vous devriez voir la sortie suivante :
Seulement deux événements ont été comptabilisés : la création du fichier « cree » et le déplacement du fichier « cree2 ». Les modifications du fichier « cree » ont été ignorées.
Surveillance d’un répertoire et exécution d’une tâche
Maintenant que nous savons quels événements suivre, nous pouvons utiliser inotifywait pour bloquer l’exécution d’un script jusqu’à ce qu’un fichier soit créé ou déplacé dans le dossier cible. Nous utiliserons les mêmes arguments que précédemment, tout en spécifiant comment le nom du fichier doit être formaté pour être utilisé dans notre tâche.
Avant de démarrer, nous devons créer un répertoire pour les fichiers déjà traités. Créez un dossier nommé « traites » :
mkdir traites
Créez ensuite un script nommé « surveiller-entrants.sh » et insérez le code suivant :
#!/bin/bash TARGET=~/entrants/ PROCESSED=~/traites/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Detection de $FILENAME, deplacement et compression mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Ce script lance la commande inotifywait avec l’option -m pour surveiller les changements indéfiniment. Chaque fois qu’un nouvel événement est détecté, le nom du fichier est transmis à la boucle while et assigné à la variable « FILENAME ». Le bloc à l’intérieur de la boucle est ensuite exécuté, déplaçant le fichier dans le répertoire « traites » et le compressant en gzip. Le fichier d’origine est remplacé par le fichier compressé, dont le nom se terminera par « .gz ».
Donnons des droits d’exécution à ce script et lançons-le depuis votre répertoire personnel :
chmod u+x surveiller-entrants.sh ./surveiller-entrants.sh
Ouvrez une seconde fenêtre de terminal et créez un nouveau fichier dans le dossier « entrants ». Examinez les contenus des dossiers « entrants » et « traites » pour voir le résultat de l’événement détecté :
Le fichier texte que nous avons créé dans le répertoire « entrants » a été détecté par le script, copié dans « traites », puis compressé en utilisant gzip.
Maintenant que nous pouvons surveiller l’arrivée de nouveaux fichiers, nous pouvons effectuer des actions plus avancées. Nous pourrions par exemple ajouter un filigrane aux images, compresser des vidéos brutes en mp4, voire télécharger chaque nouveau fichier vers un service de stockage cloud. Ce script est une excellente base pour développer vos propres processus et automatiser les tâches courantes de votre système.