2016-07-12 12 views
1

Ist es möglich, Dateien in neu erstellten Unterverzeichnissen bis zu einem bestimmten Level mit inotify zu überwachen?Inotify Monitor Unterverzeichnisse mit bestimmter Tiefe?

Lasst uns sagen, dass eine Struktur gibt es:

/home/user1/data 
/home/user2/data 
... 

Neue Benutzer werden regelmäßig hinzugefügt.

Wir wollen nur Daten innerhalb des "Daten" -Verzeichnisses überwachen, aber nicht Daten in neu erstellten Unterverzeichnissen überwachen, zum Beispiel wenn der Benutzer "/ home/user3/data/test_uploads" erstellt, sollte es nicht ' t verarbeitet werden.

Wenn wir mit der folgenden Syntax verwenden inotifywait, wird es nur vorhandene Verzeichnisse überprüfen:

inotifywait -m -e close_write /home/*/data/ 

Wenn wir neue Benutzer in/home erstellen, wird es nicht verarbeitet werden, da inotify Scans nur Verzeichnisse existieren.

Gibt es eine Möglichkeit, neu hinzugefügte Verzeichnisse bis zu einer bestimmten Ebene zu überwachen, aber nicht die Option "-r", da alle Unterverzeichnisse überwacht werden?

Vielen Dank im Voraus!

+0

Welches System fügt Benutzer hinzu? Welches System fügt Dateien zu den Datenverzeichnissen hinzu? [Möglicherweise gibt es einen besseren Weg, um Ihr Problem zu lösen als die Lösung, die Sie um Hilfe bitten möchten.] (Http://mywiki.wooledge.org/XyProblem) – ghoti

Antwort

2

inotifywait hat --exclude Option, aber leider ist es nicht --include Option und es unterstützt reguläre Ausdrücke nicht erweitert POSIX, so ist es nicht nur möglich, Dateien nicht passende bestimmte Muster aufzunehmen. Siehe Details in this answer.

Weitere Optionen:

  • Sie können nur grep Ausgabe von inotifywait, aber auf diese Weise nicht den Aufwand für die Überwachung aller unnötigen Kind Dateien zu vermeiden.

  • Sie können die gepatchte inotifywait mit der Option --include verwenden, wie oben in der Antwort beschrieben.

  • Sie können Ihr eigenes Programm mit der API inotify direkt schreiben, sodass Sie steuern können, welche Dateien überwacht und welche ausgeschlossen werden sollen. Es gibt auch Bindungen für verschiedene Skriptsprachen, einschließlich Python.

  • Sie können verschiedene inotify Wrapper, z. watchdog Modul für Python.


Hier ist ein Beispiel unter Verwendung von watchdog Python-Modul mit watchdemo.py Skript aus ihrer Repo.

starten Monitor:

$ python2 watchdemo.py shell-command \ 
    --recursive \ 
    --pattern='/home/*/data/*' \ 
    --ignore-pattern='/home/*/data/*/*' \ 
    --ignore-directories \ 
    --command='echo "${watch_event_type} ${watch_src_path}"' \ 
    /home 

Erstellen von Dateien und Verzeichnissen:

$ mkdir -p /home/user/data 
$ touch /home/user/foo 
$ touch /home/user/data/bar 
$ mkdir /home/user/data/baz 
$ touch /home/user/data/baz/qux 

Der Monitorausgang wird sein:

created /home/user/data/bar 
modified /home/user/data/bar 

Beachten Sie, dass /home/user/foo und /home/user/data/baz/qux waren nicht überein ed.

Wenn Sie nach Typ Ereignisse filtern müssen:

  • Wenn Sie watchdemo.py verwenden, überprüfen Sie in dem Shell-Befehl:

    ... \ 
    --command='[ "${watch_event_type}" = created ] && echo "${watch_src_path}"' 
    
  • Wenn Sie mit watchdog Python-Modul leiten Sie direkt den benutzerdefinierten Ereignishandler von FileSystemEventHandler ab und überschreiben Sie die erforderlichen Methoden, z on_created.

+0

Danke dafür, wirklich nützlich! Es gibt zwei Fragen für diesen Ansatz: 1) Ist es möglich, nur "erstellt" Ereignis zu überwachen, ohne "geändert"? Das Ziel ist, nur einmal benachrichtigt zu werden, wenn die Datei erstellt wird. 2) Wenn ich den vollständigen Pfad für --pattern = '/ home/*/data/*' anstelle von --pattern = './*/Data/* ', es funktioniert nicht, nicht sicher warum? Vielen Dank im Voraus! – Igor

+0

für 1), siehe aktualisierte Antwort. für 2), versuchen Sie '--verzeichnis' Option von watchdemo mit einem absoluten Pfad – gavv

+0

Danke! Die erste Option funktioniert hervorragend, es werden "erstellte" Ereignisse angezeigt. Aber zweite mit Verzeichnissen funktioniert nicht, ich habe versucht mit --verzeichnis und es erkennt die Flagge nicht, sieht aus wie es nicht existiert. Ich habe versucht mit der Option "Verzeichnisse/home/user", aber es gibt einen Fehler "OSError: Pfad ist kein Verzeichnis". Sieht aus wie etwas mit der Verzeichnisdirektive falsch ist – Igor