Warum erkennt inotifywatch Änderungen an hinzugefügten Dateien nicht?

14

Ich versuche, meinen /tmpOrdner auf Änderungen zu überwachen, indem ich Folgendes verwende inotifywatch:

sudo inotifywatch -v -r /tmp

Nach dem Erstellen einiger Dateien ( touch /tmp/test-1 /tmp/test-2) beende ich inotifywatch(mit Ctrl-) Cdie folgenden Statistiken:

Establishing watches...
Setting up watch(es) on /tmp
OK, /tmp is now being watched.
Total of 39 watches.
Finished establishing watches, now collecting statistics.
total  attrib  close_write  open  create  filename
8      2       2            2     2       /tmp/

Die Ausgabe druckt nur die Statistiken, aber nicht die erwarteten Dateien (wie hier oder hier ). Ich habe versucht , verschiedene Arten von Zugang (via cat, mktempusw.), aber es ist das gleiche.

Habe ich etwas verpasst? Es ist, weil ich auf VPS bin und etwas eingeschränkt wurde?

Betriebssystem: Debian 7.3 (inotify-tools) auf VPS

Kenorb
quelle

Antworten:

14

Dies liegt an der Art inotifywatchund 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 /tmpalle 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-1beim inotifywatchStart 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 inotifywatchselbst angegebenen übereinstimmen. Jetzt erstelle eine Datei /tmpund ü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 -rSwitch 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 inotifywatchauf ~/*(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 -rSwitch 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 inotifywatchjedoch, dass diese Informationen nicht abgerufen werden (sie werden etwas tiefer als der Verzeichnisname gespeichert). inotify-toolsbietet ein weiteres Tool mit dem Namen inotifywait, das sich ziemlich ähnlich verhalten kann inotify-watchund mehr Ausgabeoptionen bietet (einschließlich %fder 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 -mOption (Monitor) inotifywaitnach dem ersten Ereignis weiter, wodurch ein ähnliches Verhalten wie bei inotifywatch's erzeugt wird.

John WH Smith
quelle
1
.bashrcIm Beispiel wird @ serverfaultnicht in den Statistiken angezeigt, weil der Benutzer sein path/.*Ausgangsverzeichnis rekursiv überwacht, sondern weil es erweitert ist und infolgedessen eine Überwachung für alle .files unter path/( .bashrceingeschlossen) festgelegt ist. Der Befehl, der vom OP verwendet wird, gibt niemals Dateinamen aus, da die Watches für /tmpund alle Unterverzeichnisse festgelegt sind. Daher beziehen sich die Statistiken nur auf /tmpund deren Unterverzeichnisse (dh Sie sehen, dass auf Dateien zugegriffen / verschoben / usw. wurde, aber Sie erfahren nicht, auf welche Dateien zugegriffen wurde.) Namen).
don_crissti
@don_crissti Hoppla, ich habe die beiden Beispiele des OP vertauscht. Ich habe meine Antwort bearbeitet, danke!
John WH Smith
Danke, es war nützlich. Hier ist mein Befehl in allen Inhalten aller neu erstellten Test * Dateien anzuzeigen /tmp: inotifywait -m --format "%f" /tmp | grep --line-buffered ^test | xargs -L1 -I% sudo cat /tmp/% 2> /dev/null.
Kenorb
Außerdem: " Dies bedeutet, dass jedes Ereignis, das in einer Datei auftritt, die erstellt wurde, nachdem die Überwachungen abgelegt wurden, nicht erkannt wird. " Jedes Ereignis (auch die Dateierstellung) wird erkannt, da für das übergeordnete Verzeichnis BEREITS eine Überwachung festgelegt wurde spiegelt sich in der Statistik für dieses bestimmte Verzeichnis. Siehe inotifywatchAusgabe in der OP-Frage: Die 2 createEreignisse sind vorhanden (damit sie erkannt werden), aber da inotifywatchein Verzeichnis (+ alle Unterverzeichnisse) überwacht wird, beziehen sich die Statistiken nur auf dieses / diese Verzeichnisse.
don_crissti
1
Ich glaube nicht, dass wir hier auf der gleichen Wellenlänge sind ... man inotify: When a directory is monitored, inotify will return events for the directory itself, and for files inside the directory.Außerdem man inotifywatchist 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 in inotifywatchStatistiken wiedergegeben (es wird NICHT erwähnt, für welche Dateien diese Ereignisse aufgetreten sind).
don_crissti