Utiliser inotify pour surveiller un répertoire mais ne fonctionne pas à 100%


10

J'ai écrit un script bash pour surveiller un répertoire particulier /root/secondfolder/:

#!/bin/sh

while inotifywait -mr -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

Lorsque je crée un fichier appelé fourth.txtdans /root/secondfolder/et d'autres choses d'écrire, Enregistrer et fermer, il produit les éléments suivants:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Cependant, il ne fait pas écho à "close_write". Pourquoi donc?

Réponses:


16

inotifywait -m est le mode "moniteur" : il ne quitte jamais. Le shell l'exécute et attend que le code de sortie sache s'il faut exécuter le corps de la boucle, mais cela n'arrive jamais.

Si vous supprimez -m, cela fonctionnera:

while inotifywait -r -e close_write "/root/secondfolder/"
do
    echo "close_write"
done

produit

Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
/root/secondfolder/ CLOSE_WRITE,CLOSE bar
close_write
Setting up watches.  Beware: since -r was given, this may take a while!
Watches established.
...

Par défaut, inotifywait "se fermera après le premier événement", ce que vous voulez dans une condition de boucle.


Au lieu de cela, vous préférerez peut-être lire la sortie standard de inotifywait:

#!/bin/bash

while read line
do
    echo "close_write: $line"
done < <(inotifywait -mr -e close_write "/tmp/test/")

Ce script (bash) lira chaque ligne de sortie de la inotifywaitcommande dans la $linevariable à l'intérieur de la boucle, en utilisant la substitution de processus . Cela évite de configurer les montres récursives à chaque fois dans la boucle, ce qui pourrait être coûteux. Si vous ne pouvez pas utiliser bash, vous pouvez diriger à la place la commande dans la boucle: inotifywait ... | while read line .... inotifywaitproduit une ligne de sortie pour chaque événement dans ce mode, de sorte que la boucle s'exécute une fois pour chacun.


2
Piping la commande dans la boucle fonctionne, merci!
mib1413456
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.