Kann mit inotify darauf geachtet werden, dass eine bestimmte Datei erstellt wird, ohne das gesamte Verzeichnis zu überwachen?

9

Ich möchte benachrichtigt werden, wenn ein bestimmter Dateiname erstellt wird. Ich schaue inotify. Das IN_CREATEFlag ist verfügbar, um ein Verzeichnis auf Änderungen zu überwachen. Ich würde es jedoch vorziehen, nicht das gesamte Verzeichnis zu überwachen, da in diesem Verzeichnis neben der Datei, an der ich interessiert bin, möglicherweise viele Aktivitäten stattfinden. Kann dies durchgeführt werden? ?

BobDoolittle
quelle
3
Ich vermute, die Antwort ist "nein". Zumindest nicht mit inotify. Wenn Sie den Speicherort der Datei steuern können, ist es besser, ein spezielles Verzeichnis dafür zu erstellen, damit Sie das Verzeichnis überwachen können, ohne durch Ablenkungen geweckt zu werden. Wenn Sie den Speicherort nicht steuern können, müssen Sie entweder das zurückgegebene Feld "Name" mit dem (relativen) Namen Ihrer Datei vergleichen oder etwas wie accessmit aufrufen, F_OKum festzustellen, ob es noch vorhanden ist.
BobDoolittle

Antworten:

7

Der Kernel kann Sie nicht nur über eine Änderung eines bestimmten Pfads informieren. Die Gründe sind etwas subtil:

  • Unter Linux existiert ein Dateiobjekt unabhängig von den Namen, die es möglicherweise hat. Dateinamen sind tatsächlich Attribute ihres enthaltenen Verzeichnisses, und eine einzelne Datei kann mit mehreren Namen aufgerufen werden (siehe Hardlinking).

  • Der Kernel muss etwas haben, an das er inotify-Objekte anhängen kann. Es kann kein Objekt an einen Pfadnamen anhängen, da ein Pfadname kein echtes Dateisystemobjekt ist. Sie müssen eine Verbindung zum übergeordneten Verzeichnis oder zur Datei herstellen, die im Pfad beschrieben wird. Sie können jedoch keine Anhänge an die Datei anhängen, da Sie beobachten, ob eine Datei mit einem bestimmten Namen erstellt wird und keine Änderungen an einer bestimmten Datei vorgenommen werden.

Theoretisch könnte der Kernel eine API implementieren, mit der Sie Ereignisse für einen bestimmten Pfadnamen auswählen können, wenn Sie einem Verzeichnis eine Überwachung hinzufügen, ähnlich wie Sie Ereignistypen auswählen können. Dies würde die API aufblähen und der Kernel würde am Ende dieselben Daten verarbeiten und denselben Zeichenfolgenvergleich durchführen, den Sie im Userspace durchführen würden.

Gibt es einen spürbaren Leistungseinbruch beim Platzieren einer Uhr in einem sehr aktiven Verzeichnis? Ich bin mir nicht sicher, wie aktiv du meinst. Dutzende Dateien pro Sekunde, Hunderte, Millionen?

Auf jeden Fall würde ich vermeiden access: Es wird immer rassig. Zwischen den Aufrufen von accesskann eine Datei erstellt und entfernt werden , und das Aufrufen accessin einer sehr engen Schleife wird langsam sein und ist die Art von Problem, inotifydie gelöst werden soll.

Dylan Frese
quelle
Wie funktioniert inotify überhaupt, wenn ich nicht über "eine Änderung eines bestimmten Pfades" informiert werden kann? Beziehen Sie sich vielleicht speziell auf Dateipfade, aber nicht auf Verzeichnispfade?
BobDoolittle
Der Vorteil der Überprüfung im Kernel anstelle des Benutzerbereichs besteht auch darin, dass mehrere Prozesse das Verzeichnis überwachen. Anstatt sie alle unnötig in den Kontext einzuschalten und sie alle vergleichen zu lassen, können Sie einfach den Prozess umschalten, der sich tatsächlich um den betreffenden Dateipfad kümmert.
BobDoolittle
Ich meinte, dass Sie beim Überwachen eines Verzeichnisses (das offensichtlich durch einen Pfad angegeben ist) dem Kernel nicht anweisen können, nur Ereignisse mit einem bestimmten Namen auszuwählen (also ja, ich beziehe mich auf "Dateipfade"). Ich verstehe die theoretischen Vorteile, wenn Sie nicht eine Reihe von Prozessen aktivieren, aber ich muss erneut fragen, ob Sie es versucht inotifyhaben und ob die Leistung ein tatsächliches Problem war.
Dylan Frese
1
Wenn viele Prozesse an bestimmten Ereignissen interessiert sind, können Sie alternativ einen Prozess nach Dateinamen suchen und 'interessante' Ereignisse über einen UNIX-Socket an die Prozesse senden, die tatsächlich an diesen Ereignissen interessiert sind (als eine Art Dienst).
Dylan Frese
Leistungsprobleme können äußerst schwierig zu messen und zu diagnostizieren sein. Anstatt in Backsteinmauern zu gehen, ziehe ich es vor, zunächst gute Programmierpraktiken anzuwenden, Software zu entwickeln, die gute Entwurfsmuster verwendet, und solche Situationen zu vermeiden. Also nein, ich habe kein Problem beobachtet. Ich habe ein potenzielles Problem vorweggenommen und in diesem Fall die Verwendung von Inotify aufgrund möglicher Probleme vermieden. Als Entwickler von Systemsoftware bin ich davon überzeugt, robuste Mechanismen bereitzustellen, mit denen Menschen Leistungsprobleme vermeiden können. Dies ist der Zweck von inotify.
BobDoolittle