web-dev-qa-db-fra.com

comment surveiller une arborescence de répertoires complète pour les modifications sous Linux?

Comment puis-je surveiller une arborescence de répertoires complète pour les modifications sous Linux (système de fichiers ext3)?

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

Ce sont principalement des fichiers de petite taille (<1 Ko, quelques-uns jusqu’à 100 Ko). C'est une sorte de file d'attente et j'ai besoin de savoir quand les fichiers sont créés, supprimés ou modifiés dans les 5 à 10 secondes qui suivent.

Je sais qu’il existe inotify} et qu’ils trient, mais autant que je sache, ils ne surveillent qu’un seul répertoire, ce qui signifie que j’aurais besoin de 3 000 descripteurs inotify dans mon cas - plus que les 1024 descripteurs habituels autorisés pour un seul processus. Ou ai-je tort?

Si le système Linux ne peut pas me dire ce dont j'ai besoin: il existe peut-être un projet Fuse qui simule un système de fichiers (répliquant tous les accès aux fichiers sur un système de fichiers réel) et enregistre séparément toutes les modifications (non ça va pas?} _

39
Udo G

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

Cela dit, vous ne manquerez pas de descripteurs de fichiers car inotify n'a pas besoin de réserver un fd pour regarder un fichier ou un répertoire (son prédécesseur, dnotify, souffrait de cette limitation). inotify utilise "descripteurs de surveillance" à la place.

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.

13
Frédéric Hamidi

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

#!/bin/bash
while true; do

inotifywait -e modify,create,delete -r /path/to/your/dir && \
<some command to execute when a file event is recorded>

done

Ceci installera des surveillances récursives de répertoires sur l’ensemble de l’arbre et vous permettra d’exécuter une commande lorsque quelque chose change. Si vous souhaitez uniquement afficher les modifications, vous pouvez ajouter l'indicateur -m pour le mettre en mode moniteur.

48
$ inotifywait -m -r /path/to/your/directory

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

11
Madan Kumar

Est-ce que fanotify n'était pas censé fournir cette capacité à terme? Citer LWN :

Fanotify a deux 'modes' de base dirigés et globaux. [...] fanotify Global indique à la place qu'il veut tout sur le système, puis marque individuellement les inodes dont il se moque.

J'ai perdu la trace de son statut le plus récent, cependant.

3
jørgensen

Utilisez inotifywait à partir d’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

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

Exécutez-le avec ./myscript.sh /folder/to/monitor

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

En outre, 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 "event" && \
echo "event 2"

done

Si vous ne souhaitez exécuter aucune commande sur les événements, exécutez-la directement avec le modificateur -m afin de ne pas fermer:

inotifywait -e modify,create,delete,move -m -r /path/to/your/dir

2
Smeterlink

inotify est la meilleure option lorsque vous avez plusieurs sous-répertoires mais sinon, je suis habitué à utiliser cette commande ci-dessous:

watch -d find <<path>>

1
fmassica