112 votes

Comment surveiller un arbre complet de répertoires pour des modifications sous Linux ?

Comment puis-je surveiller un arbre de répertoires entier pour des changements sous Linux (système de fichiers ext3)?

Actuellement, le répertoire contient environ un demi-million de fichiers répartis dans environ 3 000 sous-répertoires, organisés en trois niveaux de répertoires.

Il s'agit principalement de petits fichiers (< 1ko, quelques-uns jusqu'à 100ko). C'est une sorte de file d'attente et j'ai besoin de savoir quand des fichiers sont créés, supprimés ou quand leur contenu est modifié dans un délai de 5 à 10 secondes après que cela se produise.

Je sais qu'il existe inotify et d'autres outils, mais autant que je sache ils ne surveillent qu'un seul répertoire, ce qui signifierait que j'aurais besoin de 3 000 poignées inotify dans mon cas - plus que les 1024 poignées habituellement autorisées pour un seul processus. Ou me trompé-je?

Si le système Linux ne peut pas me donner ce dont j'ai besoin : peut-être qu'il existe un projet FUSE qui simule un système de fichiers (réplicant tous les accès aux fichiers sur un vrai système de fichiers) et enregistre séparément toutes les modifications (je n'ai pas pu en trouver un)?

109voto

Jason Miesionczek Points 7033

J'ai fait quelque chose de similaire en utilisant l'outil inotifywait:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete -r /chemin/vers/votre/dossier && \

done

Cela permet de configurer des surveillances de répertoires récursives sur l'ensemble de l'arborescence et vous permet d'exécuter une commande lorsque quelque chose change. Si vous voulez simplement voir les changements, vous pouvez ajouter le drapeau -m pour le mettre en mode de surveillance.

52voto

Madan Kumar Points 311
$ inotifywait -m -r /chemin/vers/votre/repertoire

Cette commande suffit pour surveiller de manière récursive le répertoire pour tous les événements tels que l'accès, l'ouverture, la création, la suppression ...

32voto

Frédéric Hamidi Points 123646

À ma connaissance, il n'y a pas d'autre moyen que de définir de manière récursive une inotify surveillance sur chaque répertoire.

Ceci dit, vous ne manquerez pas de descripteurs de fichiers car inotify n'a pas besoin de réserver un fd pour surveiller un fichier ou un répertoire (son prédécesseur, dnotify, souffrait de cette limitation). inotify utilise plutôt des "descripteurs de surveillance".

Selon la documentation de inotifywatch, la limite par défaut est de 8192 descripteurs de surveillance, et vous pouvez l'augmenter en écrivant la nouvelle valeur dans /proc/sys/fs/inotify/max_user_watches.

23voto

fmassica Points 1546

Inotify est la meilleure option lorsque vous avez de nombreux sous-répertoires, mais sinon, j'ai l'habitude d'utiliser la commande suivante :

watch -d find <>

14voto

Smeterlink Points 21

Utilisez inotifywait à partir des inotify-tools :

sudo apt install inotify-tools

Créez maintenant un script myscript.sh qui inclut également les fichiers et dossiers cachés :

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1

done

Rendez le script exécutable avec chmod +x myscript.sh

Exécutez-le avec ./myscript.sh /dossier/à/monitorer

Si vous ne fournissez pas d'argument, il utilisera le répertoire de travail par défaut.

De plus, vous pouvez exécuter plusieurs commandes en ajoutant && \ à la fin de la commande précédente pour ajouter la suivante :

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1 && \
echo "événement" && \
echo "événement 2"

done

Si vous ne souhaitez pas exécuter de commande sur les événements, exécutez directement la commande avec le modificateur -m pour qu'elle ne se ferme pas :

inotifywait -e modify,create,delete,move -m -r /chemin/vers/votre/dossier

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X