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?

mib1413456
la source

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.

Michael Homer
la source
2
Piping la commande dans la boucle fonctionne, merci!
mib1413456