it-swarm.com.de

wie überwacht man einen vollständigen Verzeichnisbaum auf Änderungen in Linux?

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 erstellt, gelöscht oder der Inhalt innerhalb von 5-10 Sekunden geändert wird.

Ich weiß, dass es inotify und Sortierungen gibt, aber AFAIK überwachen sie nur ein einziges Verzeichnis, was bedeutet, dass ich in diesem 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?

Falls das Linux-System mir nicht sagen kann, was ich brauche: Vielleicht gibt es ein Fuse -Projekt, das ein Dateisystem simuliert (alle Dateizugriffe auf ein echtes Dateisystem repliziert) und alle Änderungen separat protokolliert ( es geht nicht gut)?

39
Udo G

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

Das bedeutet, dass Ihnen die Dateideskriptoren nicht ausgehen, da inotify keine fd reservieren muss, um eine Datei oder ein Verzeichnis zu betrachten (der Vorgänger dnotify hatte diese Einschränkung). inotify verwendet stattdessen "Watch Descriptors".

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

13

Ich habe etwas Ähnliches mit dem inotifywait-Tool 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 Flag -m hinzufügen, um den Überwachungsmodus zu aktivieren.

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

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

11
Madan Kumar

Sollte fanotify diese Fähigkeit nicht irgendwann zur Verfügung stellen? Zitieren LWN :

Fanotify hat zwei grundlegende und globale Modi. [...] fanotify global zeigt stattdessen .__ an, dass es alles auf dem System haben möchte, und markiert dann einzeln odes, die es nicht interessiert.

Ich habe jedoch den Überblick über den neuesten Stand verloren.

3
jørgensen

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 mit chmod +x myscript.sh ausführbar

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

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

Sie können auch mehrere Befehle ausführen, indem Sie am Ende des vorherigen Befehls && \ hinzufügen, 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 Modifikator -m aus, damit er nicht geschlossen wird:

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

2
Smeterlink

inotify ist die beste Option, wenn Sie über viele Unterverzeichnisse verfügen. Andernfalls verwende ich den folgenden Befehl:

watch -d find <<path>>

1
fmassica