Wie überwache ich einen vollständigen Verzeichnisbaum auf Änderungen unter Linux?

73

Wie kann ich einen ganzen Verzeichnisbaum auf Änderungen in Linux ( ext3- Dateisystem) überwachen ?

Derzeit enthält das Verzeichnis ungefähr eine halbe Million Dateien in ungefähr 3.000 Unterverzeichnissen , die in drei Verzeichnisebenen organisiert sind.

Dies sind meist kleine Dateien (<1 KB, einige wenige bis zu 100 KB). Es ist eine Art Warteschlange, und ich muss wissen, wann Dateien innerhalb von 5-10 Sekunden erstellt, gelöscht oder deren Inhalt geändert wird.

Ich weiß, dass es Inotify und Sortierungen gibt, aber AFAIK überwacht nur ein einziges Verzeichnis, was bedeutet, dass ich in meinem Fall 3.000 Inotify-Handles benötigen würde - mehr als die üblichen 1024 Handles, die für einen einzelnen Prozess zulässig sind. Oder liege ich falsch?

Für den Fall, dass das Linux-System mir nicht sagen kann, was ich brauche: Vielleicht gibt es ein FUSE- Projekt, das ein Dateisystem simuliert (alle Dateizugriffe auf ein reales Dateisystem repliziert) und alle Änderungen separat protokolliert (nicht möglich)?

Udo G.
quelle

Antworten:

20

Meines Wissens gibt es keine andere Möglichkeit, als rekursiv eine inotifyÜberwachung für jedes Verzeichnis festzulegen.

Das heißt, Ihnen werden die Dateideskriptoren nicht ausgehen, da Sie inotifykeine fd reservieren müssen, um eine Datei oder ein Verzeichnis anzusehen (der Vorgänger dnotifyhatte unter dieser Einschränkung gelitten). inotifyverwendet stattdessen "Watch Descriptors".

Gemäß der Dokumentation für inotifywatch beträgt das Standardlimit 8192 Überwachungsdeskriptoren , und Sie können es erhöhen, indem Sie den neuen Wert in schreiben /proc/sys/fs/inotify/max_user_watches.

Frédéric Hamidi
quelle
Hört sich gut an. Gibt es negative Aspekte, die bei der Verwendung so vieler Uhrendeskriptoren zu berücksichtigen sind?
Udo G
Nein, abgesehen von der Zeit, die für die Erstellung aller Uhren benötigt wird, werden Sie wahrscheinlich nicht auf Probleme mit nur 3000 Unterverzeichnissen stoßen.
Frédéric Hamidi
Erzeugt dies nicht mögliche Rassenprobleme wie: Erstellung von folder_subIn folder_main, Erstellung folder_sub_subin folder_sub, Inotify von folder_mainAnkünften, Uhr ist eingeschaltet folder_sub, wird aber folder_sub_subbereits übersehen, und daher ist weiterhin keine Uhr darauf installiert?
Koen G.
1
Ubuntu 18.04 hat jetzt die Standardeinstellung 'max_user_watches' auf 65536 gesetzt, was in normalen Desktop- / Serversystemen ein vernünftiger Wert zu sein scheint.
Lothar
76

Ich habe etwas Ähnliches mit dem inotifywaitTool gemacht:

#!/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

Dadurch werden rekursive Verzeichnisüberwachungen für den gesamten Baum eingerichtet und Sie können einen Befehl ausführen, wenn sich etwas ändert. Wenn Sie nur die Änderungen anzeigen möchten, können Sie das -mFlag hinzufügen , um es in den Überwachungsmodus zu versetzen.

Jason Miesionczek
quelle
7
Um dies zu vermeiden, while loopverwenden Sie -moder --monitorswitch / option / flag / arg. Ich weiß nicht, wann dieser 'Schalter' entstanden ist, aber er ist besser als Schleifen
Gwillie
2
Sie sollten auch das moveEreignis hinzufügen : inotifywait -e modify,create,delete,move -r /path/to/your/dir
famzah
28
$ inotifywait -m -r /path/to/your/directory

Dieser Befehl reicht aus, um das Verzeichnis rekursiv auf alle Ereignisse wie Zugriff, Öffnen, Erstellen, Löschen ... zu überwachen.

Madan Kumar
quelle
12

inotify ist die beste Option, wenn Sie viele Unterverzeichnisse haben, aber wenn nicht, bin ich es gewohnt, diesen Befehl unten zu verwenden:

watch -d find <<path>>

fmassica
quelle
Uhr ist auf
jeden Fall
1
watchPaging ist nicht zulässig, daher geht alles verloren, was länger als die Terminalhöhe ist (z. B. treeBefehle mit Anzahl der Dateien> Anzahl der Terminalzeilen)
Nick Bull
5

Verwenden Sie inotifywait von inotify-tools:

sudo apt install inotify-tools

Erstellen Sie nun ein Skript myscript.sh, das auch versteckte Dateien und Ordner enthält:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1

done

Machen Sie das Skript ausführbar mit chmod +x myscript.sh

Führen Sie es mit ./myscript.sh /folder/to/monitor

Wenn Sie kein Argument angeben, wird standardmäßig das Arbeitsverzeichnis verwendet.

Sie können auch mehrere Befehle ausführen, die && \am Ende des vorherigen Befehls hinzugefügt werden, um den nächsten hinzuzufügen:

#!/bin/bash
while true; do

inotifywait -e modify,create,delete,move -r $1 && \
echo "event" && \
echo "event 2"

done

Wenn Sie keinen Befehl für Ereignisse ausführen möchten, führen Sie den Befehl einfach direkt mit dem -mModifikator aus, damit er nicht geschlossen wird:

inotifywait -e modify,create,delete,move -m -r /path/to/your/dir

Smeterlink
quelle
4

Sollte Fanotify diese Fähigkeit nicht irgendwann bieten? Zitat LWN :

Fanotify hat zwei grundlegende 'Modi', die gerichtet und global sind. [...] fanotify global zeigt stattdessen an, dass alles auf dem System vorhanden sein soll, und markiert dann einzeln Inodes, die ihm egal sind.

Ich verlor jedoch den Überblick über den neuesten Status.

jørgensen
quelle
1
Laut einem Kommentar gegen stackoverflow.com/a/1847268/130352 ... ging fanotify in 2.6.36.
Chris J
0

Ich habe einen anderen Vorschlag, nur für Änderungen in den Dateien und zum Aufzeichnen von Verlaufsänderungen

benutze git

cd /folder_to_monitor
git init
git add *
git commit -m "first snapshot"

Also, nachdem Sie die Änderungen vorgenommen haben

git diff
Herr Candido
quelle
0

Speziell für große oder komplexe Überwachungsaufgaben , in dem Sie auf Triggerereignisse wollen auf das, was Sie sehen, Watchman Ein Dateidienst beobachten . Hier ist ein einfaches Beispiel, um ein Tool namens minify-css auszuführen, wenn eine CSS-Datei geändert wird:

$ watchman watch ~/src
$ watchman -- trigger ~/src buildme '*.css' -- minify-css

Es führt eine umfassende Protokollierung durch, kann mehrere Uhren, die sich in einer Verzeichnisstruktur überschneiden, effizient verarbeiten, kann über die Befehlszeile oder über JSON verwaltet werden und vieles mehr. Siehe auch

Es ist über Debian Sid und Ubuntu 20.04 erhältlich und hat es fast zweimal in Fedora geschafft, soweit ich es sehen kann ( 1450590 und 1564720 ).

nealmcb
quelle