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)?

9voto

Mr Candido Points 47

J'ai une suggestion différente, seulement pour les changements dans les fichiers et enregistrer l'historique des changements

utiliser git

cd /dossier_a_surveiller
git init
git add *
git commit -m "premier instantané"

donc après avoir apporté les modifications

git diff

4voto

jørgensen Points 5370

Est-ce que fanotify était censé résoudre cette fonctionnalité finalement? Citant LWN:

fanotify a deux modes de base, dirigé et global. [...] fanotify global indique plutôt qu'il veut tout sur le système et marque ensuite individuellement les inodes qui ne l'intéressent pas.

Je ne sais plus quelle est sa situation actuelle, cependant.

2voto

nealmcb Points 1223

Particulièrement pour les tâches de surveillance volumineuses ou complexes dans lesquelles vous souhaitez déclencher des événements en fonction de ce que vous voyez, consultez Watchman Un service de surveillance de fichiers. Voici un exemple simple pour exécuter un outil nommé minify-css chaque fois qu'un fichier CSS est modifié :

$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css

Il effectue un journal complet, peut gérer efficacement plusieurs surveillances qui se chevauchent dans une structure de répertoires, peut être administré en ligne de commande ou via json, et bien plus encore. Voir aussi

Il est disponible via Debian Sid et Ubuntu 20.04, et a presque été intégré à Fedora deux fois d'après ce que je vois (1450590 et 1564720).

2voto

xogoxec344 Points 53

J'avais le même problème, ayant un programme qui créait certains fichiers (commençant par un point) dont je voulais inspecter manuellement le contenu, mais il les supprimait automatiquement peu de temps après leur création.

Utiliser inotify dans une boucle sans l'option monitor ne fonctionnait pas pour moi, car c'était trop lent et manquait d'événements, donc j'ai créé ce script :

cible="$1"

cd "$cible"
mkdir backup/

inotifywait -e modify,create,delete --monitor -r --include "\..*" "$cible" | \
while read line
do
  echo "$line"
  if [[ "$line" == "$cible CREATE "* ]] || [[ "$line" == "$cible MODIFY "* ]]
  then
    nom_fichier=${line#"$cible CREATE "}
    nom_fichier=${nom_fichier#"$cible MODIFY "}
    cp --verbose "$nom_fichier" backup/
  fi
done

-1voto

Utilisez la commande watch, c'est facile à utiliser et une commande Linux native (installée sur presque toutes les distributions linux)

watch -n   

par exemple

cela affichera les changements du répertoire /tmp/test toutes les 200 millisecondes

watch -n 0.2 ls -la /tmp/test

pour une utilisation récursive, vous pouvez utiliser watch comme ci-dessous

 watch -n 0.2 find

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