Utilizzo di inotify per monitorare una directory ma non funziona al 100%


10

Ho scritto uno script bash per monitorare una directory particolare /root/secondfolder/:

#!/bin/sh

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

Quando creo un file chiamato fourth.txtin /root/secondfolder/e roba di scrittura ad esso, Salva e chiudi, esso emette il seguente:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Tuttavia, non corrisponde a "close_write". Perché?

Risposte:


16

inotifywait -m è la modalità "monitor" : non esce mai. La shell lo esegue e attende che il codice di uscita sappia se eseguire il corpo del ciclo, ma non arriva mai.

Se rimuovi -m, funzionerà:

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

Per impostazione predefinita, inotifywait "termina dopo che si è verificato il primo evento", che è ciò che si desidera in una condizione di loop.


Invece, potresti preferire leggere l'output standard di inotifywait:

#!/bin/bash

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

Questo script (bash) leggerà ogni riga di output del inotifywaitcomando nella $linevariabile all'interno del ciclo, usando la sostituzione del processo . Evita di impostare gli orologi ricorsivi ogni volta intorno al circuito, il che potrebbe essere costoso. Se non è possibile utilizzare bash, è possibile reindirizzare il comando nel ciclo invece: inotifywait ... | while read line .... inotifywaitproduce una riga di output per ciascun evento in questa modalità, quindi il ciclo viene eseguito una volta per ciascuno.


2
L'inoltro del comando nel loop funziona, grazie!
mib1413456,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.