Herausfinden, wie oft eine Datei geöffnet wurde?

Herausfinden, wie oft eine Datei geöffnet wurde?

Ok, hier ist ein Rätsel: Wie kann ich herausfinden, wie oft eine bestimmte Datei (in jedem Modus) von einem oder allen Prozessen geöffnet wurde, die derzeit auf einem Linux-Rechner laufen? D. h. wie viele Dateideskriptoren global (oder innerhalb eines Namespaces/Containers, spielt keine Rolle) verwendet werden, um auf eine bestimmte Datei/einen bestimmten Inode zu verweisen?

Eine Möglichkeit, dies herauszufinden, wäre wahrscheinlich, lsof zu verwenden und zu zählen, wie oft der betreffende Dateiname in der Ausgabe vorkommt. Aber das scheint unelegant, und auf jeden Fall bräuchte ich so etwas programmgesteuert in C.

Bearbeiten: oder vielleicht eine ähnliche, aber andere Frage, die auch hilfreich wäre: Wird eine bestimmte Datei (eine zufällige Datei im Dateisystem, also keine anhängenden Handler und kein Warten darauf, dass etwas passiert) überhaupt von irgendeinem Prozess (möglicherweise mit Ausnahme dieses) geöffnet?

Antwort1

Für die aktuell geöffneten Dateien müssten Sie unter Linux stat()alle /proc/*/fd/*Dateien anzeigen und die Inode-Nummern vergleichen und alle lesen /proc/*/maps(und auch die Inode-Nummern vergleichen).

Überprüfen Sie die Flags in /proc/*/fdinfo/*(Sie benötigen eine relativ neue Linux-Version) und die zweite Spalte in, /proc/*/mapsum zu sehen, ob die Datei im Lese- oder Schreibmodus (oder beides oder mit Anhängen …) geöffnet ist.

Antwort2

Ich denke, Sie möchten einen Dateisystem-Ereignishandler an die Datei anhängen, inotifydas ist der richtige Weg. Es gibt ein Befehlszeilentool sowie eine C-API. Ich bin kein Experte im Umgang damit, ich habe nur ein paar Minuten mit dem Befehlszeilentool herumgespielt, also werde ich nicht versuchen, Codebeispiele bereitzustellen, aber Sie können bei Google-Suchen viele Informationen finden.

https://www.ibm.com/developerworks/library/l-inotify/

https://linux.die.net/man/7/inotify

Es werden Benachrichtigungen für Folgendes bereitgestellt (aus der Manpage oben):

IN_ACCESS
File was accessed (read) (*).

IN_ATTRIB
Metadata changed, e.g., permissions, timestamps, extended attributes, link count (since Linux 2.6.25), UID, GID, etc. (*).

IN_CLOSE_WRITE
File opened for writing was closed (*).

IN_CLOSE_NOWRITE
File not opened for writing was closed (*).

IN_CREATE
File/directory created in watched directory (*).

IN_DELETE
File/directory deleted from watched directory (*).

IN_DELETE_SELF
Watched file/directory was itself deleted.

IN_MODIFY
File was modified (*).

IN_MOVE_SELF
Watched file/directory was itself moved.

IN_MOVED_FROM
File moved out of watched directory (*).

IN_MOVED_TO
File moved into watched directory (*).

IN_OPEN
File was opened (*).

verwandte Informationen