GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Comment exécuter des commandes sur les changements de fichier ou de répertoire avec Incron sur Ubuntu

Ce tutoriel vous montre comment vous pouvez utiliser incron sur un système Ubuntu pour exécuter des commandes lorsqu'un fichier ou un répertoire est modifié. Le démon incron est similaire à cron, mais au lieu d'exécuter des commandes en fonction du temps, il peut déclencher des commandes lorsqu'un événement de fichier ou de répertoire se produit (par exemple, une modification de fichier, des changements d'autorisations, etc.).

1 Installation d'Incron

Les étapes suivantes doivent être exécutées en tant qu'utilisateur root. Veuillez vous connecter au shell de votre système Ubuntu et devenir root avec :

sudo su

Le logiciel Incron est disponible dans le référentiel Ubuntu. Par conséquent, je vais l'installer avec apt comme ceci :

apt-get install incron

3 Comment utiliser Incron

Comme mentionné dans le premier chapitre, Incron présente de nombreuses similitudes avec l'outil Cron. Là où Cron a sa commande crontab pour gérer les tâches cron, Incron a la commande incrontab. Vous pouvez utiliser la commande incrontab  liste d'options (-l), modifier (-e) et supprimer (-r) pour afficher et modifier les entrées incrontab.

Exécutez la commande suivante pour obtenir un aperçu complet sur incrontab :

man incrontab

Dans la page de manuel, vous trouverez la note suivante :

Si /etc/incron.allow existe, seuls les utilisateurs répertoriés ici peuvent utiliser incron. Sinon, si /etc/incron.deny existe, seuls les utilisateurs NON répertoriés ici peuvent utiliser incron. Si aucun de ces fichiers n'existe, tout le monde est autorisé à utiliser incron. (Remarque importante :ce comportement n'est pas sécurisé et sera probablement modifié pour être compatible avec le style utilisé par ISC Cron.) L'emplacement de ces fichiers peut être modifié dans la configuration.

Cela signifie que si nous voulons utiliser incrontab en tant que root, nous devons supprimer /etc/incron.allow (ce qui n'est pas sûr)...

rm -f /etc/incron.allow

... ou nous ajoutons l'utilisateur root au fichier incron.allow (qui est l'option recommandée). Ouvrez le fichier /etc/incron.allow :

nano /etc/incron.allow

Et ajoutez la ligne suivante.

root

Avant de faire cela, vous obtiendrez des messages d'erreur comme celui-ci lorsque vous essayez d'utiliser incrontab :

server1:~# incrontab -l
user 'root' is not allowed to use incron
server1:~#

Après ça marche :

server1:~# incrontab -l
no table for root
server1:~#

Nous pouvons maintenant utiliser cette commande :

incrontab -e

Pour créer des tâches incron. Examinons maintenant plus en détail la page de manuel pour comprendre la syntaxe.

man 5 incrontab

La page de manuel montre le format des lignes de tabulation cron. Le format suit ce schéma :

<path> <mask> <command>

... où  est un répertoire ou un fichier. Veuillez noter qu'incron n'est pas en mesure de surveiller les fichiers dans les sous-répertoires du répertoire que vous avez défini, donc seuls les fichiers de ce répertoire seront observés.

peut être l'une des options suivantes :

IN_ACCESS           File was accessed (read) (*)
IN_ATTRIB           Metadata changed (permissions, timestamps, extended attributes, etc.) (*)
IN_CLOSE_WRITE      File opened for writing was closed (*)
IN_CLOSE_NOWRITE    File not opened for writing was closed (*)
IN_CREATE           File/directory created in watched directory (*)
IN_DELETE           File/directory deleted from watched directory (*)
IN_DELETE_SELF           Watched file/directory was itself deleted
IN_MODIFY           File was modified (*)
IN_MOVE_SELF        Watched file/directory was itself moved
IN_MOVED_FROM       File moved out of watched directory (*)
IN_MOVED_TO         File moved into watched directory (*)
IN_OPEN             File was opened (*)

Lors de la surveillance d'un répertoire, les événements marqués d'un astérisque (*) ci-dessus peuvent se produire pour les fichiers du répertoire, auquel cas le champ de nom dans les
données d'événement renvoyées identifie le nom du fichier dans le répertoire.

Le symbole IN_ALL_EVENTS est défini comme un masque binaire de tous les événements ci-dessus. Deux symboles de commodité supplémentaires sont IN_MOVE, qui est une combinaison de IN_MOVED_FROM et IN_MOVED_TO, et IN_CLOSE qui combine IN_CLOSE_WRITE et IN_CLOSE_NOWRITE.

Les autres symboles suivants peuvent être spécifiés dans le masque :

IN_DONT_FOLLOW      Don't dereference pathname if it is a symbolic link
IN_ONESHOT          Monitor pathname for only one event
IN_ONLYDIR          Only watch pathname if it is a directory

De plus, il existe un symbole qui n'apparaît pas dans le jeu de symboles inotify. C'est IN_NO_LOOP. Ce symbole désactive la surveillance des événements jusqu'à ce que l'événement en cours soit complètement géré (jusqu'à ce que son processus enfant se termine).

est la commande qui doit être exécutée lorsque l'événement se produit. Les jokers suivants peuvent être utilisés dans la spécification de la commande :

$$   dollar sign
[email protected]   watched filesystem path (see above)
$#   event-related file name
$%   event flags (textually)
$&   event flags (numerically)

Si vous surveillez un répertoire, alors [email protected] contient le chemin du répertoire et $# le fichier qui a déclenché l'événement. Si vous regardez un fichier, alors [email protected] contient le chemin d'accès complet au fichier et $# est vide.

Si vous avez besoin des caractères génériques mais que vous n'êtes pas sûr de leur traduction, vous pouvez créer une tâche incron comme celle-ci.

Créez un répertoire qui sera surveillé :

mkdir /tmp/testdir

Ouvrez ensuite l'incrontab :

incrontab -e

et ajoutez la ligne suivante :

/tmp/testdir/ IN_MODIFY echo "$$ [email protected] $# $% $&"

Ensuite, vous créez ou modifiez un fichier dans le répertoire /tmp/testdir/ et jetez un œil à /var/log/syslog - ce journal indique quand une tâche incron a été déclenchée, si elle a réussi ou s'il y a eu des erreurs, et quel est le résultat réel commande a été exécutée (c'est-à-dire que les caractères génériques sont remplacés par leurs valeurs réelles).

À des fins de test, je vais ajouter deux fichiers, helloworld.txt et helloworld2.txt dans /tmp/testdir/ avec la commande echo :

echo 'How are you?' > /tmp/testdir/helloworld.txt
echo 'How are you?' > /tmp/testdir/helloworld2.txt

Vérifions donc le syslog avec tail pour les incron ecents :

tail /var/log/syslog
...
Apr 12 18:49:22 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld.txt IN_MODIFY 2")
Apr 12 18:50:31 server1 incrond[6441]: (root) CMD (echo "$ /tmp/testdir/ helloworld2.txt IN_MODIFY 2")

Maintenant assez de théorie. Créons nos premières tâches incron. J'aimerais surveiller le fichier /etc/apache2/apache2.conf et le répertoire /etc/apache2/vhosts/, et chaque fois qu'il y a des changements, je veux qu'incron redémarre Apache. Voici comment nous procédons :

incrontab -e
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/sites-available/ IN_MODIFY /usr/sbin/service apache2 restart

C'est ça. À des fins de test, vous pouvez modifier votre configuration Apache et jeter un œil à /var/log/syslog, et vous devriez voir qu'incron redémarre Apache.

REMARQUE  :N'effectuez aucune action à partir d'une tâche incron dans un répertoire que vous surveillez pour éviter les boucles. Exemple : Lorsque vous surveillez le répertoire /tmp pour les modifications et que chaque modification déclenche un script qui écrit un fichier journal dans /tmp, cela provoquera une boucle et pourrait amener votre système à une charge élevée ou même le planter.

Pour lister toutes les tâches incron définies, vous pouvez exécuter :

incrontab -l
server1:~# incrontab -l
/etc/apache2/apache2.conf IN_MODIFY /usr/sbin/service apache2 restart
/etc/apache2/vhosts/ IN_MODIFY /usr/sbin/service apache2 restart
server1:~#

Pour supprimer toutes les tâches incron de l'utilisateur actuel, exécutez :

incrontab -r
server1:~# incrontab -r
removing table for user 'root'
table for user 'root' successfully removed
server1:~#

  • incron :http://inotify.aiken.cz/?section=incron&page=about&lang=en

Ubuntu
  1. Déclencher des commandes sur les modifications de fichiers/répertoires avec Incron sur Debian Etch

  2. Comment exécuter le programme Hadoop MapReduce sur Ubuntu 16.04

  3. Comment installer le fichier deb dans Ubuntu (avec exemples)

  4. Comment changer de répertoire de travail lors de l'ouverture d'un fichier en double-cliquant sur le bureau Ubuntu ?

  5. Comment exécuter un script shell lorsqu'un fichier ou un répertoire change ?

Comment supprimer un répertoire dans Ubuntu 20.04

Comment supprimer un fichier dans Ubuntu

Comment configurer la mise en réseau avec Netplan sur Ubuntu

Comment exécuter des fichiers .bin et .run dans Ubuntu

Comment flasher/graver une image de système d'exploitation avec Etcher sur Ubuntu

Comment supprimer des données de fichier Exif avec ExifTool dans Ubuntu 20.04