web-dev-qa-db-fra.com

Comment surveiller en continu le répertoire à l'aide de la commande dnotify / inotify

Je suis nouveau dans la commande dnotify/inotify. Quelqu'un peut-il m'aider à écrire un script de telle sorte qu'il surveille en permanence un répertoire et indique qu'il y a un changement ou une modification.

32
sai sindhu

Inotify lui-même est un module du noyau accessible via les appels de par ex. un programme C. http://www.ibm.com/developerworks/linux/library/l-ubuntu-inotify/

Il existe une suite d'applications appelée inotify-tools, qui contient:

inotifywait - attend les modifications des fichiers avec inotify

http://linux.die.net/man/1/inotifywait

et

inotifywatch - collecte des statistiques d'accès au système de fichiers à l'aide d'inotify

http://linux.die.net/man/1/inotifywatch

Vous pouvez utiliser inotify directement à partir de la ligne de commande, par exemple comme ceci pour surveiller en permanence toutes les modifications dans le répertoire personnel (peut générer beaucoup de sortie):

inotifywait -r -m $HOME

Et voici un script qui surveille en permanence et réagit à l'activité du journal Apache, copié à partir du fichier man d'inotifywait:

#!/bin/sh
while inotifywait -e modify /var/log/messages; do
  if tail -n1 /var/log/messages | grep httpd; then
    kdialog --msgbox "Apache needs love!"
  fi
done
29
thnee

Voici ce que j'utilise pour voir les opérations sur un fichier individuel. "-m" provoque la surveillance par rapport à la sortie après un seul événement. Pour obtenir des horodatages, vous avez besoin d'au moins la version 3.13 des outils inotify, mais si cela n'est pas important (ou non disponible sur votre système d'exploitation ou difficile à mettre à jour), vous pouvez ignorer les options timefmt et format. "cat /etc/resolv.conf" dans un autre Shell conduit aux résultats ci-dessous:

$ inotifywait -m --timefmt '%H:%M' --format '%T %w %e %f' /etc/resolv.conf

Setting up watches.  
Watches established.
12:49 /etc/resolv.conf OPEN 
12:49 /etc/resolv.conf ACCESS 
12:49 /etc/resolv.conf CLOSE_NOWRITE,CLOSE 

inotifywait a également des options pour surveiller les répertoires, donc consultez la page de manuel. Ajoutez -r pour récursif pour surveiller les enfants d'un dir.

Voici un exemple avec les commandes que j'ai tapées dans une fenêtre différente affichée avec le préfixe "->":

$ inotifywait -mr --timefmt '%H:%M' --format '%T %w %e %f' /home/acarwile/tmpdir
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.

-> cd into directory, no info
-> ls in directory
13:15 /home/acarwile/tmpdir/ OPEN,ISDIR 
13:15 /home/acarwile/tmpdir/ CLOSE_NOWRITE,CLOSE,ISDIR 

-> touch newfile
13:16 /home/acarwile/tmpdir/ CREATE newfile
13:16 /home/acarwile/tmpdir/ OPEN newfile
13:16 /home/acarwile/tmpdir/ ATTRIB newfile
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE newfile

-> mv newfile renamedfile
13:16 /home/acarwile/tmpdir/ MOVED_FROM newfile
13:16 /home/acarwile/tmpdir/ MOVED_TO renamedfile

-> echo hello >renamedfile
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile
13:16 /home/acarwile/tmpdir/ OPEN renamedfile
13:16 /home/acarwile/tmpdir/ MODIFY renamedfile
13:16 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile

-> touch renamedfile
13:17 /home/acarwile/tmpdir/ OPEN renamedfile
13:17 /home/acarwile/tmpdir/ ATTRIB renamedfile
13:17 /home/acarwile/tmpdir/ CLOSE_WRITE,CLOSE renamedfile

-> rm renamedfile
13:17 /home/acarwile/tmpdir/ DELETE renamedfile

-> cd ..; rmdir tmpdir
13:17 /home/acarwile/tmpdir/ DELETE_SELF 

Après ce qui précède, j'ai essayé de refaire le tmpdir ("mkdir tmpdir") mais je n'en ai pas obtenu de sortie. Le nouveau tmpdir n'est pas le même répertoire que l'ancien tmpdir. Il est temps de juste ^ C et de l'arrêter notifier attendre.

12
Alan Carwile

Comme je l'ai dit sur https://superuser.com/a/747574/28782 , j'ai créé un script d'aide qui utilise inotifywait sans certaines de ses limitations directes: - inotifyexec

Exemple d'utilisation (en supposant que vous l'avez ajouté dans votre chemin système en tant qu'exécutable):

inotifyexec "echo test" -r .
4
Wernight