Usando inotify para monitorear un directorio pero no funciona al 100%

10

He escrito un script bash para monitorear un directorio particular /root/secondfolder/:

#!/bin/sh

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

Cuando se crea un archivo llamado fourth.txten /root/secondfolder/y cosas por escribir en él, guarde y cierre que, emite la siguiente:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Sin embargo, no hace eco "close_write". ¿Porqué es eso?

mib1413456
fuente

Respuestas:

16

inotifywait -m es el modo "monitor" : nunca sale. El shell lo ejecuta y espera el código de salida para saber si se debe ejecutar el cuerpo del bucle, pero eso nunca llega.

Si lo elimina -m, funcionará:

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

produce

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.
...

Por defecto, inotifywait "saldrá después de que ocurra el primer evento", que es lo que desea en una condición de bucle.


En cambio, es posible que prefiera leer la salida estándar de inotifywait:

#!/bin/bash

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

Este script (bash) leerá cada línea de salida del inotifywaitcomando en la $linevariable dentro del bucle, utilizando la sustitución del proceso . Evita configurar los relojes recursivos en todo momento alrededor del ciclo, lo que puede ser costoso. Si no puede usar bash, se puede canalizar el comando en el bucle en su lugar: inotifywait ... | while read line .... inotifywaitproduce una línea de salida para cada evento en este modo, por lo que el ciclo se ejecuta una vez para cada uno.

Michael Homer
fuente
2
Instalar el comando en el bucle funciona, ¡gracias!
mib1413456