Frage

Ich habe vor kurzem ein Dropbox-System inotify, die gerade für Dateien erstellt in einem bestimmten Verzeichnis erstellt. Das Verzeichnis Ich beobachte wird von einem NFS-Server angebracht und inotify verhält anders, als ich erwarten würde. Betrachten Sie das folgende Szenario, in dem ein inotify Skript auf Maschine A ausgeführt wird, beobachten / some / nfs / dir / auch / sichtbar / to / B.

-Mit Eine Maschine, eine Datei in / some / nfs / dir / auch / sichtbar / to / B, wird das Skript verhält sich wie erwartet zu erstellen. Mit Maschine B die gleiche Aktion durchzuführen, wird das Skript über eine neue Datei nicht benachrichtigt fiel im Verzeichnis.
-Wenn das Skript auf dem NFS-Server ausgeführt wird, wird sie benachrichtigt, wenn Dateien von beiden Maschinen A und Maschine B erstellt werden.

Ist das ein Fehler in dem Fehler in dem Paket Zugang inotofy Ich verwende, oder ist das erwartete Verhalten?

War es hilfreich?

Lösung

erfordert inotify Unterstützung aus dem Kernel zu arbeiten. Wenn eine Anwendung ein Verzeichnis verfolgt, fragt es den Kernel es zu informieren, wenn diese Änderungen auftreten. Wenn die Änderung eintritt, zusätzlich zu diesen Änderungen auf der Festplatte zu schreiben, meldet der Kernel auch den beobachtete Prozess.

Auf einer Remote-NFS-Maschine ist die Änderung an den Kernel nicht sichtbar; es geschieht völlig fern. NFS früher inotify und es gibt keinen Netzwerk-Level-Support für die es in NFS oder etwas gleichwertig.

Wenn Sie dies umgehen möchten, können Sie einen Dienst auf dem Speicherserver laufen (da dieser Kernel wird immer Änderungen sehen auf das Dateisystem), dass die Broker inotify Anforderungen für Remote-Rechnern und leiten die Daten an die Remote-Clients.

Edit: Es scheint mir seltsam, dass NFS sollte für ihren Mangel an Unterstützung für inotify verantwortlich gemacht.

  

Network File System (NFS) ist ein verteiltes Dateisystem Protokoll, das ursprünglich entwickelt von Sun Microsystem im Jahr 1984 , wikipedia-Artikel

Allerdings:

  

Inotify (inode benachrichtigt) ist ein Linux-Kernel-Subsystem , die Dateisysteme Ankündigung Änderungen am Dateisystem erweitern wirkt. [...] Es hat sich in den Mainline-Linux-Kernel von Version 2.6.13 (18. Juni 2005 ) [...] aufgenommen. Wikipedia-Artikel

Es ist schwer, eine tragbare Netzwerk-Protokoll / Anwendung zu erwarten, dass ein bestimmte Kernel-Feature für ein anderes Betriebssystem entwickelt, zu unterstützen und das erschien mehr als zwanzig Jahre später . Auch wenn es haben sind Erweiterungen für sie, würden sie nicht auf andere Betriebssysteme verfügbar oder nützlich sein.

* Hervorhebung von mir in allen Fällen


Ein weiteres Problem mit dieser; Hier können wir annehmen, kein Netzwerk überhaupt verwenden, sondern ein lokales Dateisystem mit guter inotify Unterstützung: ext3 (nehme an, bei /mnt/foo montiert). Doch statt einer realen Festplatte wird das Dateisystem von einem Loopback-Gerät angebracht ist; und die zugrunde liegende Datei ist wiederum zugänglich an einem anderen Ort in der VFS (sagen wir, /var/images/foo.img).

Nun, ich ist nicht sollen montiert ext3-Dateisysteme ändern, aber es ist immer noch ziemlich sicher, dies zu tun, wenn die Änderung des Dateiinhaltes ist anstelle von Metadaten.

So nehme ein kluger Benutzer ändert das Dateisystem Bild (/var/images/foo.img) in einem Hex-Editor, den Inhalt einer Datei mit einigen anderen Daten, während zur gleichen Zeit ersetzt ein inotify Uhr ist die gleiche Datei Beobachtung auf das Dateisystem gemountet.

Es gibt keine vernünftige Art und Weise einen für arrangieren inotify immer das beobachtete Verfahren dieser Art von Veränderung zu informieren. Obwohl es wahrscheinlich einige Verrenkungen, die ext3 Ankündigung machen werden zu nehmen und die Änderung ehren, nichts davon gelten würde, sagen wir, die xfs drtiver, die sonst recht ähnlich ist.

Auch sollte es. Du betrügst!. inotify können Sie Änderungen nur informieren, die durch die VFS am eigentlichen einhängepunkt aufgetreten beobachtet. Wenn die Änderungen aufgetreten außerhalb der VFS, wegen einer Änderung der zugrunde liegenden Daten, inotify Ihnen nicht helfen kann und nicht dafür ausgelegt ist, dieses Problem zu lösen.

Haben Sie darüber nachgedacht, eine Nachrichtenwarteschlange für Netzwerk-Benachrichtigung mit?

Andere Tipps

fand ich eine SGI FAM mit einem Supervisor-Daemon Dateiänderungs Monitor. Es unterstützt NFS und Sie können einige Beschreibung auf Wiki

siehe

Für jeden, der über diese Frage bei der Suche nach einer Antwort, warum bindest Montag auf Docker gekommen ist, wird nicht Dateiänderungen von Host-Verzeichnis (für heißes Nachladen einer App) erkennt, dann ist es, weil die Ausbreitung der Datei zwischen Host ändert und Behälter ist nicht auf den Behälterkern kommuniziert.

Nur Änderungen aus dem Behälter selbst sind mit dem Kernel mitgeteilt. Lösung hierfür ist Ihre Live-Reload-Dienstprogramm wiederum auf „Polling-Modus“ zu haben, anstatt mit fsnotify.

Ich stimme mit SingleNegationElimination Erklärung und möchte hinzufügen, dass iSCSI-Ziele arbeiten, da sie den Kernel alarmieren.

So Dinge auf „echten“ Dateisystemen (bezogen auf das System, das ist) auslösen Inotify aufmerksam zu machen. Wie Rsync'ing, net-catting etwas in einer montierten Partition.

Wenn Sie Benachrichtigungen über inotify bekommen (oder haben verwenden inotify) Sie einen cron machen können rsync -avz über, um das Dateisystem. Nachteile sind selbstverständlich, dass Sie reales System hdd Raum verwenden.

I zweite @SingleNegationElimination.

Außerdem können Sie versuchen, notify-Spediteur .

  • Maschine A Uhren für lokale inotify Ereignisse, dann leitet sie an Maschine B (über UDP).
  • Maschine B nicht (nicht?) Wiederholen die Ereignisse, sondern löst ein ATTRIB Ereignis für die geänderte Datei.

Wenn Sie vagrant verwenden, verwenden Vagabund-notify-Spediteur .

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top