Description

inotify permet d’ajouter un “watch descriptor” sur un fichier et d’envoyer des notifications au système lorsqu’un événement affecte ce fichier. Pour rappel, dans le monde UNIX, un fichier peut représenter un simple fichier, mais aussi un répertoire, un périphérique, un lien, etc.

Les principaux événements qui peuvent être suivis sont :

  • IN_ACCESS : le fichier est lu ;
  • IN_MODIFY : le fichier est modifié ;
  • IN_ATTRIB : les attributs du fichier sont modifiés ;
  • IN_OPEN : le fichier est ouvert ;
  • IN_CLOSE_WRITE : le fichier est fermé après avoir été ouvert en écriture ;
  • IN_CLOSE_NOWRITE : le fichier est fermé après avoir été ouvert en lecture ;
  • IN_MOVED_FROM / IN_MOVED_TO : le fichier a été déplacé ou renommé ;
  • IN_DELETE_SELF : le fichier a été supprimé ;
  • IN_DELETE : un fichier a été supprimé dans le répertoire surveillé ;
  • IN_CREATE : un fichier a été créé dans le répertoire surveillé.

Incron

Pour installer incron :

sudo apt-get install incron

Une fois l’installation terminée, vous devez ajouter les utilisateurs autorisés à utiliser incron dans le fichier /etc/incron.allow.

$ cat /etc/incron.allow
myuser

Utilisation

Ajoutez un fichier pour chaque tâche/répertoire à surveiller dans /etc/incron.d/.

/mon/repertoire/a/surveiller IN_CLOSE_WRITE php task.php --file $@/$#

Note : incron ne gère pas la récursivité.

inotify-tools

Installation

sudo apt-get install inotify-tools

Description

inotify-tools offre un moyen d’appeler inotify directement depuis la ligne de commande.

inotifywait

Cette commande permet d’attendre un événement avant de poursuivre une exécution. Par exemple, pour éviter d’exécuter une commande qui nécessite un fichier et de tomber en erreur :

inotifywait -e close_write /var/run/jboss.pid && supervision_jboss.sh

L’option -t (timeout) permet de définir un délai d’attente en secondes, par exemple, pour sortir d’une erreur si un événement est trop long à arriver :

backup.sh & ; inotifywait -e close_write -t 10000 backup_report || killall backup.sh

inotifywatch

inotifywatch génère un rapport d’activité lorsque des événements se produisent sur les répertoires que vous surveillez :

$ inotifywatch /var/cache/apt/archives &
[1] 18607
root@work:~# Establishing watches...
Finished establishing watches, now collecting statistics.

root@work:~# apt-get autoclean
root@work:~# kill %1
total  access  close_write  close_nowrite  open  delete  filename
1919   7       1            2              3     1906    /var/cache/apt/archives/

Par défaut, inotifywatch s’arrête lorsqu’il reçoit un signal d’interruption. Une option de timeout (-t) existe également pour l’arrêter après le nombre de secondes spécifié. Surveiller les activités dans le répertoire d’un utilisateur pendant une minute :

$ inotifywatch -r /home/user/ -t 60
Establishing watches...
Finished establishing watches, now collecting statistics.
total  access  modify  close_write  close_nowrite  open  moved_from  moved_to  create  filename
16     3       3       2            0              2     2           2         2       /home/user/.mozilla/firefox/e3lq4lm3.default/
13     11      0       0            1              1     0           0         0       /home/user/.cache/myapp/mycache/

Mettre en place un script de surveillance

Pour conclure, voici comment mettre en place un script de surveillance pour exécuter inotifywait et envoyer la sortie à une commande. Par exemple, vous pouvez créer un fichier watch.sh avec ce contenu :

#!/bin/bash

WATCH_PATH=/var/watch/dir/
PHP_BIN=/usr/bin/php

inotifywait -rme move,close_write,delete --format "%e %w%f" "$WATCH_PATH" | while read -r file; do
  "$PHP_BIN" console cmd:opt "${file}"
done

Lancer le script en arrière-plan

chmod +x watch.sh
./watch.sh
[Ctrl+z]
bg
disown -h