2012-01-02 17 views
25

Jak mogę monitorować całe drzewo katalogów dla zmian w systemie plików Linuksa (ext3)?jak monitorować pełne drzewo katalogów pod kątem zmian w systemie Linux?

Obecnie katalog zawiera około pół miliona plików około 3000 podkatalogów, zorganizowanych w trzech poziomów katalogów.

Są to w większości małe pliki (< 1kb, kilka do 100 kb). Jest to rodzaj kolejki i muszę wiedzieć, kiedy pliki są tworzone, usuwane lub ich treść modyfikowana w ciągu 5-10 sekund od tego zdarzenia.

wiem, że jest inotify i rodzaju, ale AFAIK one jedynie monitorować pojedynczy katalog, co oznacza, że ​​będę potrzebował 3000 inotify uchwyty w moim przypadku - więcej niż zwykłe 1024 uchwytami dozwolonych dla pojedynczego procesu. Czy ja się mylę?

W przypadku systemu Linux nie może mi powiedzieć, co trzeba: być może jest FUSE projekt, który symuluje system plików (replikacji wszystkie pliki dostępów na rzeczywistym systemie plików) i osobno rejestruje wszystkie modyfikacje (nie mógł dobrze jeden)?

Odpowiedz

12

Według mojej wiedzy, nie ma innego sposobu niż rekurencyjne ustawienie zegarka inotify w każdym katalogu.

To powiedziawszy, nie zabraknie deskryptorów plików, ponieważ inotify nie musi rezerwować pliku fd, aby obejrzeć plik lub katalog (jego poprzednik, dnotify, cierpiał z powodu tego ograniczenia). inotify zamiast tego używa "deskryptorów zegarków".

Zgodnie z dokumentacją dla , domyślnym limitem jest 8192 deskryptorów zegarków, a można go zwiększyć, wpisując nową wartość do /proc/sys/fs/inotify/max_user_watches.

+0

Brzmi dobrze. Jakiekolwiek negatywne aspekty, które należy wziąć pod uwagę podczas korzystania z tylu deskryptorów zegarków? –

+0

Nie, oprócz czasu potrzebnego na stworzenie wszystkich zegarków, nie sądzę, że napotkasz problemy tylko z 3000 podkatalogami. –

3

Czyż fanotyfikacja nie miała w końcu zapewnić tej zdolności? Cytując LWN:

"fanotify ma dwa podstawowe" tryby "skierowane i globalne. [...] fanotify globalny zamiast tego oznacza , że chce wszystko w systemie, a następnie pojedynczo oznacza i-węzły, które go nie obchodzą. "

Zgubiłem trop, jaki był jego ostatni status.

+1

Zgodnie z komentarzem do http://stackoverflow.com/a/1847268/130352 ... fanotify przeszedł do wersji 2.6.36. –

28

Robiłem coś podobnego pomocą funkcji inotifywait:

#!/bin/bash 
while true; do 

inotifywait -e modify,create,delete -r /path/to/your/dir && \ 
<some command to execute when a file event is recorded> 

done 

Ten Instalator katalogu rekurencyjne zegarków na całym drzewie i pozwala wykonać polecenie gdy coś się zmienia. Jeśli chcesz zobaczyć zmiany, możesz dodać flagę -m, aby przejść do trybu monitorowania.

+1

To jest bardziej pomocne niż zaakceptowana odpowiedź, +1 – qed

+2

Aby uniknąć 'while while' użyj przełącznika' -m' lub '--monitor'/option/flag/arg. Nie wiem kiedy ten "przełącznik" powstał, ale jest lepszy niż pętle – gwillie

+0

Powinieneś także dodać zdarzenie 'move': ' inotifywait -e zmodyfikuj, utwórz, usuń, przenieś -r/path/do/twój/dir' – famzah

3
$ inotifywait -m -r /path/to/your/directory 

Polecenie to wystarczy, aby obejrzeć katalog rekurencyjnie dla wszystkich zdarzeń, takich jak dostęp, otwarte, tworzyć, usuwać ...

Powiązane problemy