Dies liegt an der Art inotifywatch
und Weise, wie Sie es verwenden , und an der Art und Weise, wie das Tool selbst funktioniert. Wenn Sie ausführen inotifywatch -r /tmp
, sehen Sie /tmp
alle Dateien, die sich bereits darin befinden. Wenn Sie eine Datei darin erstellen /tmp
, werden die Verzeichnismetadaten so aktualisiert, dass sie die Inode-Nummer der neuen Datei enthalten. Dies bedeutet, dass die Änderung am erfolgt /tmp
, nicht am /tmp/test-1
. Außerdem ist keine Uhr darauf platziert , da sie /tmp/test-1
beim inotifywatch
Start nicht vorhanden war inotify
. Dies bedeutet, dass ein Ereignis, das in einer Datei auftritt, die nach dem Platzieren der Uhren erstellt wurde, nicht erkannt wird . Vielleicht verstehen Sie es besser, wenn Sie es selbst sehen:
$ inotifywatch -rv /tmp &
Total of n watches.
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Wenn Sie den Suchmechanismus aktiviertinotify_add_watch(2)
haben , gibt der letzte Befehl die Anzahl der von eingerichteten Uhren an inotifywatch
. Diese Nummer sollte mit der von sich inotifywatch
selbst angegebenen übereinstimmen. Jetzt erstelle eine Datei /tmp
und überprüfe noch einmal:
$ inotifywatch -rv /tmp &
Total of n watches.
$ touch /tmp/test1.txt
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n
Die Anzahl wird nicht erhöht, was bedeutet, dass die neue Datei nicht überwacht wird. Beachten Sie, dass das Verhalten anders ist, wenn Sie stattdessen ein Verzeichnis erstellen:
$ inotifywatch -rv /tmp &
Total of n watches.
$ mkdir /tmp/test1
$ cat /sys/kernel/debug/tracing/trace | grep inotifywatch | wc -l
n + 1
Dies liegt an der Art und Weise, wie sich der -r
Switch verhält :
-r
, --recursive
: [...] Wenn neue Verzeichnisse in überwachten Verzeichnissen erstellt werden, werden diese automatisch überwacht.
Edit: Ich habe ein wenig verwirrt zwischen zwei Beispielen, aber im ersten Fall werden die Uhren richtig platziert , da die Benutzer Anrufe inotifywatch
auf ~/*
(die erweitert wird, don_crissti Kommentar hier sehen ). Das Home-Verzeichnis wird ebenfalls überwacht, da es ~/.*
enthält ~/.
. Theoretisch sollte es auch enthalten ~/..
, was in Kombination mit dem -r
Switch dazu führen sollte, dass das gesamte System überwacht wird.
Es ist jedoch möglich, den Namen der Datei abzurufen, die ein Erstellungsereignis in einem überwachten Verzeichnis auslöst. Ich vermute inotifywatch
jedoch, dass diese Informationen nicht abgerufen werden (sie werden etwas tiefer als der Verzeichnisname gespeichert). inotify-tools
bietet ein weiteres Tool mit dem Namen inotifywait
, das sich ziemlich ähnlich verhalten kann inotify-watch
und mehr Ausgabeoptionen bietet (einschließlich %f
der hier gesuchten):
inotifywait -m --format "%e %f" /tmp
Von der Manpage :
--format <fmt>
Ausgabe in einem benutzerdefinierten Format mit printf-ähnlicher Syntax. [...] Folgende Konvertierungen werden unterstützt:
%f
: Wenn ein Ereignis in einem Verzeichnis auftritt, wird dieses durch den Namen der Datei ersetzt, die das Ereignis ausgelöst hat .
%e
: Ersetzt durch die aufgetretenen Ereignisse, durch Kommas getrennt.
Außerdem läuft die -m
Option (Monitor) inotifywait
nach dem ersten Ereignis weiter, wodurch ein ähnliches Verhalten wie bei inotifywatch
's erzeugt wird.
.bashrc
Im Beispiel wird @serverfault
nicht in den Statistiken angezeigt, weil der Benutzer seinpath/.*
Ausgangsverzeichnis rekursiv überwacht, sondern weil es erweitert ist und infolgedessen eine Überwachung für alle .files unterpath/
(.bashrc
eingeschlossen) festgelegt ist. Der Befehl, der vom OP verwendet wird, gibt niemals Dateinamen aus, da die Watches für/tmp
und alle Unterverzeichnisse festgelegt sind. Daher beziehen sich die Statistiken nur auf/tmp
und deren Unterverzeichnisse (dh Sie sehen, dass auf Dateien zugegriffen / verschoben / usw. wurde, aber Sie erfahren nicht, auf welche Dateien zugegriffen wurde.) Namen)./tmp
:inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null
.inotifywatch
Ausgabe in der OP-Frage: Die 2create
Ereignisse sind vorhanden (damit sie erkannt werden), aber dainotifywatch
ein Verzeichnis (+ alle Unterverzeichnisse) überwacht wird, beziehen sich die Statistiken nur auf dieses / diese Verzeichnisse.man inotify
:When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.
Außerdemman inotifywatch
ist klar, welche Ereignisse überwacht werden:EVENTS
>> ... Auf eine überwachte Datei oder eine Datei in einem überwachten Verzeichnis wurde / closed / open / zugegriffen. etc (bedeutet, dass Ereignisse eingeschlossen werden, die in einer Datei auftreten ). Ereignisse für eine Datei, die nach dem Einstellen der Überwachung auf das übergeordnete Verzeichnis erstellt wurde, werden erkannt und ininotifywatch
Statistiken wiedergegeben (es wird NICHT erwähnt, für welche Dateien diese Ereignisse aufgetreten sind).