Używanie inotify do monitorowania katalogu, ale nie działa w 100%


10

Napisałem skrypt bash do monitorowania określonego katalogu /root/secondfolder/:

#!/bin/sh

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

Kiedy tworzę plik o nazwie fourth.txtw /root/secondfolder/i zapisu rzeczy do niej zapisać i zamknąć go, wyprowadza następujące:

/root/secondfolder/ CLOSE_WRITE,CLOSE fourth.txt

Jednak nie wyświetla echa „close_write”. Dlaczego?

Odpowiedzi:


16

inotifywait -m jest trybem „monitor” : nigdy nie wychodzi. Powłoka je uruchamia i czeka na kod wyjścia, aby wiedzieć, czy uruchomić ciało pętli, ale to nigdy nie nadchodzi.

Jeśli usuniesz -m, będzie działać:

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

produkuje

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

Domyślnie inotifywait „zakończy działanie po wystąpieniu pierwszego zdarzenia”, co jest pożądane w warunkach pętli.


Zamiast tego możesz przeczytać standardowe wyjście inotifywait:

#!/bin/bash

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

Ten skrypt (bash) wczyta każdy wiersz wyjściowy inotifywaitpolecenia do $linezmiennej wewnątrz pętli, stosując podstawienie procesu . Pozwala to uniknąć ustawiania zegarów rekurencyjnych za każdym razem w pętli, co może być kosztowne. Jeśli nie można używać bash, można rura polecenia do pętli zamiast: inotifywait ... | while read line .... inotifywaittworzy jeden wiersz wyjścia dla każdego zdarzenia w tym trybie, więc pętla działa raz dla każdego.


2
Przesyłanie polecenia do pętli działa, dziękuję!
mib1413456
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.