Monitorowanie zmiany pliku - inotifywait z paczki inotify-tools.

W Amazon Web Services (AWS; Cloud Computing Services), w instancji używanej przez LOT, spotkaliśmy się z ciekawym problemem. Grzegorz zdiagnozował, że przestało działać wykorzystywane polecenie inotifywait. Po sprawdzeniu, czy nie ma to związku z udziałem NFS'a i opcjami montowania systemu plików, wstępnie wiążemy ten fakt z instalacją nowego jadra, co rozwiązywało problem z Dirty COW (CVE-2016-5195). 
Do instalacji wymagane jest repozytorium epel:
yum install inotify-tools

Ponieważ pakiet inotify-tools korzysta z funkcji jądra systemu (od wersji 2.6.13) monitorującej system plików, prawdopodobne jest to, że jakieś oprogramowanie przestało działać. Dlatego poniższe rozwiązania wykorzystują bardziej klasyczne mechanizmy. Metoda szybsza, bazująca na czasie modyfikacji pliku (nie dostępu, tylko modyfikacji!). Zmienna $1 odpowiada za przekazanie nazwy pliku, a zmienna $2 za ustalenie czasu pomiędzy testami. Sleep nie zużywa zasobów procesora, a akceptuje czasy jak np.: 1, 0.1, 0.001, więc mamy duże możliwości ustawienia czasów reakcji.
while "$(stat -c%Y ""$1"")" "$(sleep ""$2""; stat -c%Y ""$1"")" ] ; do true; done

Metoda wolniejsza, lecz nie powolna, bazująca na dokładnej analizie pliku:
while "$(md5sum ""$1"")" "$(sleep ""$2""; md5sum ""$1"")" ] ; do true; done

Poprzednie komendy, oraz poniższe różnią się sposobem porównywania plików. Przykłady różnią się uwzględnieniem, lub też nie, ścieżki dostępu i nazwy pliku.
while "$(md5sum < ""$1"")" "$(sleep ""$2""; md5sum < ""$1"")"  ] ; do true; done

Analogicznie, jak powyżej, wersja uproszczona: 
md5first=0
md5second=0
while "$md5first" "$md5second"  ] ; do.
    md5first=( $(md5sum "$1") )
    sleep "$2"
    md5second=( $(md5sum "$1") )
done

Oraz wersja nieuwzględniająca nazwy i ścieżki pliku:
md5first=0
md5second=0
while "$md5first" "$md5second"  ] ; do.
    md5first=`md5sum "$1" |cut -f 1 -d " "`
    sleep "$2"
    md5second=`md5sum "$1" |cut -f 1 -d " "`
done

Brak komentarzy:

Prześlij komentarz