Wynika to ze sposobu użytkowania inotifywatch
i sposobu działania samego narzędzia. Po uruchomieniu inotifywatch -r /tmp
zaczniesz oglądać /tmp
i wszystkie pliki, które już w nim są. Po utworzeniu wewnątrz pliku /tmp
, metadane katalog jest aktualizowana zawierać numer i-węzła nowego pliku, co oznacza, że zmiana dzieje się na /tmp
nie /tmp/test-1
. Dodatkowo, ponieważ /tmp/test-1
nie było go tam po inotifywatch
uruchomieniu, nie ma inotify
na nim zegarka. Oznacza to, że żadne zdarzenie, które nastąpi w pliku utworzonym po umieszczeniu zegarków, nie zostanie wykryte . Możesz to lepiej zrozumieć, jeśli zobaczysz to sam:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Jeśli włączyłeś mechanizm śledzeniainotify_add_watch(2)
, ostatnie polecenie poda liczbę ustawionych zegarków inotifywatch
. Liczba ta powinna być taka sama jak podana przez inotifywatch
siebie. Teraz utwórz plik w środku /tmp
i sprawdź ponownie:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Liczba nie wzrośnie, co oznacza, że nowy plik nie jest oglądany. Pamiętaj, że zachowanie jest inne, jeśli zamiast tego utworzysz katalog:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Wynika to ze sposobu działania -r
przełącznika :
-r
, --recursive
: [...] Jeśli w obserwowanych katalogach zostaną utworzone nowe katalogi, zostaną one automatycznie obejrzane.
Edit: Mam trochę mylić między dwoma przykładami, ale w pierwszym przypadku , zegarki są prawidłowo umieszczone, ponieważ rozmowy użytkowników inotifywatch
na ~/*
(co jest rozszerzona, patrz komentarz don_crissti tutaj ). Katalog domowy jest również oglądany, ponieważ ~/.*
zawiera ~/.
. Teoretycznie powinien on także zawierać ~/..
, co w połączeniu z -r
przełącznikiem powinno skutkować obserwowaniem całego systemu.
Jednakże, to jest możliwe, aby uzyskać nazwę pliku wywołując utworzyć zdarzenie w oglądanym katalogu, ale zgaduję inotifywatch
nie odzyskać te informacje (jest zapisany trochę głębiej niż nazwa katalogu). inotify-tools
udostępnia inne narzędzie o nazwie inotifywait
, które może zachowywać się podobnie inotify-watch
, i zapewnia więcej opcji wyjściowych (w tym %f
, czego szukasz tutaj):
inotifywait -m --format "%e %f" /tmp
Ze strony podręcznika :
--format <fmt>
Dane wyjściowe w formacie określonym przez użytkownika przy użyciu składni podobnej do printf. [...] Obsługiwane są następujące konwersje:
%f
: gdy zdarzenie wystąpi w katalogu, zostanie ono zastąpione nazwą pliku, który spowodował wystąpienie zdarzenia .
%e
: zastąpione zdarzeniem (zdarzeniami), które miały miejsce, oddzielone przecinkami.
Poza tym -m
opcja (monitor) będzie inotifywait
działać po pierwszym zdarzeniu, co spowoduje odtworzenie zachowania podobnego do tego inotifywatch
.
.bashrc
na przykład @serverfault
nie pojawiają się w statystykach, ponieważ użytkownik monitoruje swój katalog domowy rekurencyjnie ale ponieważpath/.*
rozszerza się iw efekcie zegarek jest ustawiony dla wszystkich .files poniżejpath/
(.bashrc
w zestawie). Polecenie używane przez OP nigdy nie wypisuje nazw plików, ponieważ zegarki są ustawione dla/tmp
i wszystkich podkatalogów, dlatego statystyki będą dotyczyły tylko/tmp
i ich podkatalogów (tzn. Zobaczysz, że pliki zostały otwarte / przeniesione / itp., Ale nie powie ci nazwy)./tmp
:inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
.inotifywatch
dane wyjściowe w pytaniu OP: 2create
zdarzenia są tam (więc zostały wykryte), ale ponieważinotifywatch
ogląda katalog (+ dowolne podkatalogi) statystyki dotyczą tylko tego / tych katalogów.man inotify
:When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.
Ponadtoman inotifywatch
jasne jest, które zdarzenia są oglądane:EVENTS
>> ... Dostęp do obejrzanego pliku lub pliku w obserwowanym katalogu był dostępny / zamknięty / otwarty / itp. (oznacza w tym zdarzenia „występujące w pliku” ). Zdarzenia dla pliku utworzonego po ustawieniu zegarka w katalogu macierzystym BĘDĄ wykryte i odzwierciedlone winotifywatch
statystykach (NIE będzie podawać, dla których plików wystąpiły te zdarzenia).