2015-02-27 10 views
5

Also habe ich etwas Code eingerichtet, um eine Konfigurationsdatei für Bearbeitungen zu sehen, die funktionierte, bis ich VIM verwendete, um die Datei zu bearbeiten, dann musste ich das Verzeichnis auch nach Umbenennungen und Kreationen ansehen. Dann entdeckte ich, dass die Umbenennungen in der Pfadhierarchie nicht höher waren. Dann habe ich in Symlinks gesucht ... gaaahhhh!Verwenden Sie INotify, um eine Datei mit mehreren symbolischen Links zu sehen

erste Einrichtung eine aus Beispiel eine (von vielen) tricky Symlink Szenarien zeigt:

mkdir config1 
touch config1/config 
ln -s config1 machine1 

mkdir config2 
touch config2/config 
ln -s config2 machine2 

ln -s machine1 active 

, nun ein Dateiname wie aktiv/config gegeben, die ich sehen will, kann ich sehen, wie ein inotify erhalten Uhr-Deskriptor für:

config1/ -> watch active/ follow symlinks (watches inode for config1) 
active/ -> watch active/ dont follow symlinks (watches inode for active symlink 
active/config -> watch active/config (watches inode for config1/config) 

Wie füge ich eine Uhr auf dem symbollink machine1 hinzu? Muss ich einen Weg finden, jeden Symlink manuell zu durchlaufen, indem ich währenddessen jeweils Uhren hinzufüge? Wie?

Der Zweck ist, zu ermöglichen:

mkdir config3 
touch config3/config 
ln -s -f -n config3 machine1 

Und haben inotify warnen, dass die aktive/config umgeleitet wurde. Im Moment sieht es aus wie ich eine Uhr für hinzufügen:

- target file inode 
- every directory inode leading to the file (to detect moves/renames of directories) 
- every symlink inode involved in reaching any of the above 

Es muss ein einfacher Weg, um nur eine Datei ansehen? Bin ich vom Weg abgekommen oder ist das wirklich so?

+0

Sie sehen nicht "die eine Datei" - Sie sehen den vollständigen Pfad, Datei enthalten. Das, plus 'inotify', das nicht rekursiv ist, deckt die ersten 2 Punkte ab. Das Vorhandensein von Symlinks erfordert Ihren letzten Punkt. – tucuxi

+0

Ja, ich verstehe, dass INotify so eingerichtet sein muss, dass alle Inodes beobachtet werden, die am Erreichen der interessierenden Datei beteiligt sind, aber ich bin nicht sicher, was der Anwendungsfall ist, dass * nicht erfordert, was ich beschrieben habe? Es ist komplex (ich habe nicht einmal '..' und Symlinks erwähnt), leicht zu vermasseln (Referenzzählung mehrfach angetroffener Verzeichnisse und Symlinks), hat viele Race Conditions (einen Symlink beobachten, während jemand es ändert?) Und alle anderen scheint es zu brauchen. Aber es gibt keine Bibliothek, die das macht? Huh. – Speed8ump

+0

Mit allen seinen Mängeln ist inotify immer noch viel besser als das dnotify, das es ersetzt (siehe zum Beispiel http://lwn.net/Articles/604686/). Bezüglich des Mangels an Bibliotheken haben Sie nicht erwähnt, dass Sie nach ihnen gesucht haben; libinotifytools kann Ihre Aufgaben leicht vereinfachen (es macht den syscalls für Sie), aber ich kann nichts finden, das Ihren genauen Anwendungsfall abdeckt. – tucuxi

Antwort

3

Meine Antwort ist ein direktes "ja, du machst es richtig".

Nachdem ich sorgfältig die inotify syscall manpage gelesen habe, kann ich keinen Weg sehen, jeden Schritt eines (möglicherweise symlinked) Weg-zu-einer-Datei zu beobachten, um alle Änderungen am vollständigen Pfad zu erkennen.

Dies scheint nur die Art und Weise inotify funktioniert: Es sieht nur bestimmte Dateien oder Ordner, und es führt keine Rekursion für sich. Das, plus das explizite Folgen von Symlinks, scheint Ihrem 3-Schritt-Plan genau zu entsprechen.

Ausgewählte Zitate aus der Man-Page:

Die folgenden weiteren Bits in der Maske angegeben werden beim Aufruf inotify_add_watch (2): IN_DONT_FOLLOW (seit Linux 2.6.15)

Sie nicht dereferenzieren Pfadname wenn es ein symbolischer Link ist.

[...]

Einschränkungen und Vorbehalte

Inotify Überwachung von Verzeichnissen nicht rekursiv ist: Unterverzeichnisse eines Verzeichnisses zu überwachen, müssen zusätzliche Uhren erstellt werden. Dies kann bei großen Verzeichnisbäumen viel Zeit in Anspruch nehmen. [...]

Diese FAQ verleiht auch Unterstützung für Ihre Strategie re Symlinks:

Q: Was ist mit dem IN_ONLYDIR und IN_DONT_FOLLOW Flaggen? IN_ONLYDIR stellt sicher, dass das Ereignis nur in einem Verzeichnis auftritt. Wenn Sie eine solche Überwachung für eine Datei erstellen, werden keine Ereignisse ausgegeben. IN_DONT_FOLLOW verbietet folgende symbolische Links (diese werden selbst überwacht und nicht die Dateien, auf die sie verweisen).