Ce tutoriel vous montrera comment utiliser les événements du système de fichiers Linux (notifier) pour être notifié à chaque fois qu’un fichier apparaît dans un répertoire. Vous pouvez les utiliser comme déclencheurs pour automatiser les tâches courantes sur votre système.
Nous allons écrire un script qui surveille un répertoire et agit sur les nouveaux fichiers ajoutés. Chaque fichier est gzippé et déplacé vers un autre répertoire, dès qu’il est détecté. Le script utilise le sous-système inotify, via un utilitaire appelé inotify-tools. Mais d’abord, installons l’outil et expérimentons.
Table des matières
Installer inotify-tools et gzip
Utilisez apt-get pour installer ce paquet sur votre système si vous utilisez Ubuntu ou une autre distribution basée sur Debian. Sur les autres distributions Linux, utilisez plutôt l’outil de gestion des packages de votre distribution Linux.
sudo apt-get install inotify-tools gzip
Expérimenter avec les outils inotify
Commençons par regarder un répertoire et voir quels événements se déclenchent lorsque de nouveaux fichiers arrivent. Nous utiliserons un outil appelé inotifywatch, qui fait partie de inotify-tools. Créez un nouveau répertoire appelé «entrant»:
mkdir incoming
Commencez à regarder ce répertoire en exécutant la commande suivante:
inotifywatch -v incoming
Cela demandera à inotify de surveiller tous les événements du système de fichiers dans le répertoire «entrant». L’option -v permet à l’outil d’afficher des informations supplémentaires sur ce qu’il fait. Nous n’avons pas spécifié d’option de délai d’expiration (-t), et la commande continuera à collecter les événements jusqu’à ce que nous quittions avec CTRL + C. À ce stade, notre terminal devrait ressembler à ceci:
Ouvrez une nouvelle fenêtre (ou onglet) de terminal et passez au répertoire entrant. Utilisez la commande tactile pour créer un nouveau fichier nommé «nouveau fichier».
cd incoming/ touch newfile
Revenez maintenant à la première fenêtre du terminal et arrêtez inotifywatch en appuyant sur CTRL + C.
Un tableau des événements sera diffusé sur la console, indiquant une instance de «create», «open», «attrib» et «close_write». Ces quatre événements se sont produits lorsque nous avons utilisé touch pour créer un nouveau fichier, défini ses attributs d’accès au fichier, l’avons ouvert pour écrire un caractère de fin nul, puis l’avons fermé par la suite. Ce ne sont là que quelques-uns de la multitude d’événements qui peuvent être surveillés sur un système de fichiers avec inotify-tools. Vous pouvez voir la liste complète sur la page principale d’inotifywatch.
Pour nos besoins, nous ne sommes intéressés que par deux événements:
«Créer» – lorsqu’un fichier est créé dans le répertoire cible.
«Déplacé vers» – lorsqu’un fichier est déplacé d’un autre emplacement vers le répertoire cible.
Essayons à nouveau inotifywatch, mais cette fois en lui demandant de surveiller ces deux événements uniquement. Exécutez cette commande dans la première fenêtre du terminal:
inotifywatch -v -e create -e moved_to incoming
Dans la deuxième fenêtre ou onglet du terminal, essayons de créer un nouveau fichier, de modifier son contenu, puis de déplacer le fichier d’un autre emplacement vers le répertoire cible. Toutes ces commandes sont exécutées à partir du répertoire personnel.
touch incoming/created echo Testing123 >> incoming/created touch /tmp/created2 mv /tmp/created2 incoming/
Revenez à la première fenêtre du terminal et arrêtez inotifywatch en appuyant sur CTRL + C. Nous verrons la sortie suivante:
Seuls deux événements ont été comptés: la création d’un fichier appelé «created.txt» et le déplacement d’un fichier existant appelé «created2.txt». Tout le reste, comme la modification de «created.txt», a été ignoré.
Regarder un répertoire et exécuter une tâche
Maintenant que nous savons quels événements suivre, nous pouvons utiliser un autre outil appelé inotifywait pour bloquer l’exécution jusqu’à ce qu’un fichier soit créé ou déplacé vers notre répertoire cible. Nous utiliserons les mêmes arguments que nous l’avons fait avec inotifywatch et spécifierons également comment nous voulons que le nom de fichier soit formaté pour être utilisé dans notre tâche.
Avant de commencer, nous avons besoin d’un répertoire pour contenir les fichiers qui ont déjà été traités. Créez un répertoire appelé «traité»:
mkdir processed
Ensuite, créez un nouveau script appelé «watch-incoming.sh» et ajoutez le contenu répertorié ci-dessous:
#!/bin/bash TARGET=~/incoming/ PROCESSED=~/processed/ inotifywait -m -e create -e moved_to --format "%f" $TARGET | while read FILENAME do echo Detected $FILENAME, moving and zipping mv "$TARGET/$FILENAME" "$PROCESSED/$FILENAME" gzip "$PROCESSED/$FILENAME" done
Le script exécute la commande inotifywait avec l’option -m. Cela rend le moniteur de commande change indéfiniment. Chaque fois qu’un nouvel événement est détecté, le nom de fichier est passé à la commande de lecture et injecté dans la variable «FILENAME». Le bloc sous la boucle while est exécuté, dans lequel le fichier est d’abord déplacé vers le répertoire «traité» puis gzippé. Le fichier d’origine est remplacé par le fichier compressé et le nom de fichier se terminera par «.gz».
Accordons des autorisations d’exécution sur ce script et exécutons-le depuis notre répertoire personnel.
chmod u+x watch-incoming.sh ./watch-incoming.sh
Ouvrez la deuxième fenêtre du terminal et créez un nouveau fichier dans le répertoire «entrant». Répertoriez le contenu du répertoire «entrant» et «traité» pour voir les résultats de l’événement détecté:
Le fichier texte brut que nous avons copié dans le répertoire «entrant» a été détecté par le script, copié dans «traité» puis compressé à l’aide de gzip.
Nous pouvons faire des tâches intéressantes maintenant que nous sommes en mesure de surveiller l’arrivée de nouveaux fichiers dans un répertoire. Par exemple, nous pourrions ajouter un filigrane aux fichiers image, compresser des vidéos brutes au format mp4 et même télécharger chaque nouveau fichier que nous voyons dans un compartiment Amazon S3. Ce script est un bon point de départ pour lancer vos propres flux de travail et automatiser les tâches courantes sur votre système.