So überwachen Sie Dateisystemereignisse in Dateien und Verzeichnissen unter Linux
Inode notify (inotify) ist ein Linux-Kenel-Subsystem, das APIs zur Überwachung von Dateisystemereignissen bereitstellt. Neben der Kommunikation mit solchen APIs aus geeigneten Programmiersprachen ist es möglich, die exponierten Funktionalitäten zu nutzen, indem einige explizit entwickelte Befehlszeilentools wie inotifywait verwendet werden, die problemlos in allen wichtigen Linux-Distributionen installiert werden können.
In diesem Tutorial sehen wir, wie Sie das Dienstprogramm inotifywait installieren und verwenden, um Dateisystemereignisse unter Linux zu überwachen.
In diesem Tutorial lernen Sie:
- So installieren Sie inotifywait auf einigen der am häufigsten verwendeten Linux-Distributionen
- So verwenden Sie inotifywait, um Dateisystemereignisse in Dateien und Verzeichnissen zu überwachen
- So überwachen Sie ein bestimmtes Ereignis
Installation
Das Befehlszeilenprogramm inotifywait ist Teil des Pakets inotify-tools
, das in den offiziellen Repositories aller wichtigen Linux-Distributionen verfügbar ist. Um das Paket auf Fedora und Fedora-basierten Distributionen zu installieren, führen wir Folgendes aus:
$ sudo dnf install inotify-tools
Um es stattdessen unter Debian und Derivaten zu installieren, können wir den folgenden Befehl verwenden:
$ sudo apt install inotify-tools
Das Paket ist auch im "Extra"-Archilinux-Repository verfügbar. Wir können den pacman-Paketmanager
verwenden, um die Installation durchzuführen:
$ sudo pacman -Sy inotify-tools
Überwachen von Dateisystemereignissen
Das Dienstprogramm inotifywait
kann verwendet werden, um auf Dateisystemereignisse zu warten und darauf zu reagieren. In der einfachsten möglichen Verwendung rufen wir das Dienstprogramm auf und übergeben den Pfad der Datei oder des Verzeichnisses, das wir überwachen möchten, als Argument. Im folgenden Beispiel verwenden wir die Datei ~/.bash_profile
als Beispiel:
$ inotifywait ~/.bash_profile
Setting up watches.
Watches established.
Wenn das Tool wie oben ausgeführt wird, erstellt es eine überwachte Datei für die angegebene Datei und ist vorhanden, wenn das erste Ereignis eintritt. Versuchen wir als Beispiel, den Inhalt der Datei zu lesen:
$ cat ~/.bash_profile
Sobald wir den Befehl von einem anderen Terminalfenster aus starten, werden wir über ein "OPEN"-Ereignis benachrichtigt und inotify wird beendet:
/home/doc/.bash_profile OPEN
Wenn wir einen Verzeichnispfad als Argument an den Befehl übergeben, werden alle Dateien in diesem Verzeichnis überwacht. Allerdings nicht den Inhalt von Unterverzeichnissen, da der Befehl standardmäßig nicht rekursiv ist. Um dieses Verhalten zu ändern und einen ganzen Verzeichnisbaum zu überwachen, müssen wir lediglich die Option -r
(--recursive
) verwenden. Wenn wir das Dienstprogramm auf diese Weise ausführen, müssen wir möglicherweise die maximale Anzahl der zulässigen Beobachtungen erhöhen, was durch Schreiben des entsprechenden Werts in die Datei /proc/sys/fs/inotify/max_user_watches
erreicht werden kann. Beachten Sie jedoch, dass Änderungen an der Datei beim Neustart nicht beibehalten werden. In diesem Tutorial erfahren Sie, wie Sie sie dauerhaft machen können.
Abhören eines bestimmten Ereignisses
In bestimmten Situationen möchten wir möglicherweise nur benachrichtigt werden, wenn ein bestimmtes Ereignis in einer Datei eintritt. In solchen Fällen können wir einfach die Option -e
(kurz für --event
) verwenden und eines der unterstützten EVENTS als Argument übergeben. Um beim vorherigen Beispiel zu bleiben, um nur Ereignisse in der ~/.bash_profile-Datei
zu überwachen, würden wir Folgendes ausführen:
$ inotifywait -e modify ~/.bash_profile
Da wir nur auf das Ereignis "modify" hören, wird der Befehl weiter ausgeführt, wenn wir den Inhalt der Datei lesen, aber er benachrichtigt uns, sobald wir versuchen, darauf zu schreiben, wie beim einfachen Anhängen eines Inhalts:
$ echo "# This is just a comment" >> ~/.bash_profile
Das Ereignis wird wie erwartet benachrichtigt:
/home/doc/.bash_profile MODIFY
Die Ereignisse, auf die wir lauschen können, sind in der folgenden Tabelle aufgeführt, wie im Handbuch des Dienstprogramms beschrieben:
- access
Es wurde aus einer überwachten Datei oder einer Datei innerhalb eines überwachten Verzeichnisses gelesen.
- modify
Es wurde in eine überwachte Datei oder eine Datei innerhalb eines überwachten Verzeichnisses geschrieben.
- attrib
Die Metadaten einer überwachten Datei oder einer Datei innerhalb eines überwachten Verzeichnisses wurden geändert. Dazu gehören Zeitstempel, Dateiberechtigungen, erweiterte Attribute usw.
- close_write
Eine überwachte Datei oder eine Datei innerhalb eines überwachten Verzeichnisses wurde geschlossen, nachdem sie im beschreibbaren Modus geöffnet wurde. Dies bedeutet nicht zwangsläufig, dass in die Datei geschrieben wurde.
- close_nowrite
Eine überwachte Datei oder eine Datei in einem überwachten Verzeichnis wurde geschlossen, nachdem sie im schreibgeschützten Modus geöffnet wurde.
- close
Eine überwachte Datei oder eine Datei innerhalb eines überwachten Verzeichnisses wurde geschlossen, unabhängig davon, wie sie geöffnet wurde. Beachten Sie, dass dies einfach durch das Lauschen auf close_write und close_nowrite implementiert wird, daher werden alle empfangenen Abschlussereignisse als eines von
ausgegeben.\ndiese, nicht SCHLIESSEN.- open
Eine überwachte Datei oder eine Datei innerhalb eines überwachten Verzeichnisses wurde geöffnet.
- moved_to
Eine Datei oder ein Verzeichnis wurde in ein überwachtes Verzeichnis verschoben. Dieses Ereignis tritt auch dann auf, wenn die Datei einfach aus und in dasselbe Verzeichnis verschoben wird.
- moved_from
Eine Datei oder ein Verzeichnis wurde aus einem überwachten Verzeichnis verschoben. Dieses Ereignis tritt auch dann auf, wenn die Datei einfach aus und in dasselbe Verzeichnis verschoben wird.
- move
Eine Datei oder ein Verzeichnis wurde aus oder in ein überwachtes Verzeichnis verschoben. Beachten Sie, dass dies einfach durch das Lauschen auf moved_to und moved_from implementiert wird, daher werden alle empfangenen Abschlussereignisse als eines oder beide dieser Ereignisse ausgegeben, nicht als MOVE.
- move_self
Eine überwachte Datei oder ein überwachtes Verzeichnis wurde verschoben. Nach diesem Ereignis wird die Datei oder das Verzeichnis nicht mehr überwacht.
- create
Eine Datei oder ein Verzeichnis wurde in einem überwachten Verzeichnis erstellt.
- delete
Eine Datei oder ein Verzeichnis in einem überwachten Verzeichnis wurde gelöscht.
- delete_self
Eine überwachte Datei oder ein überwachtes Verzeichnis wurde gelöscht. Nach diesem Ereignis wird die Datei oder das Verzeichnis nicht mehr überwacht. Beachten Sie, dass dieses Ereignis auch dann auftreten kann, wenn nicht explizit auf es reagiert wird.
- unmount
Das Dateisystem, auf dem sich eine überwachte Datei oder ein überwachtes Verzeichnis befindet, wurde nicht bereitgestellt. Nach diesem Ereignis wird die Datei oder das Verzeichnis nicht mehr überwacht. Beachten Sie, dass dieses Ereignis auch dann auftreten kann, wenn es nicht explizit abgehört wird.
Hören im "Monitor"-Modus
In früheren Beispielen haben wir gesehen, wie standardmäßig eine mit inotifywait eingerichtete Überwachung vorhanden ist, sobald eines der überwachten Ereignisse eintritt.
\nWenn wir möchten, dass der Befehl weiterhin auf Ereignisse lauscht, können wir einfach die Option -m
verwenden, die die Kurzform von --monitor
ist.
Im folgenden Beispiel richten wir eine Überwachung der Zieldatei im Überwachungsmodus ein, lesen dann zuerst ihren Inhalt und fügen dann einen Teil des Inhalts an. Jeder Vorgang umfasst drei Ereignisse, die alle protokolliert werden:
$ inotifywait -m ~/.bash_profile
Setting up watches.
Watches established.
/home/doc/.bash_profile OPEN # The file is opened
/home/doc/.bash_profile ACCESS # The file is read
/home/doc/.bash_profile CLOSE_NOWRITE,CLOSE # The file is closed after being opened in read-only mode
/home/doc/.bash_profile OPEN # The file is opened
/home/doc/.bash_profile MODIFY # The file is modified (we appended content to it)
/home/doc/.bash_profile CLOSE_WRITE,CLOSE # The file is closed after being opened in writable mode
Ausschließen von Dateien von der Überwachung
Wie wir bereits sagten, kann das Dienstprogramm inotifywait verwendet werden, um Ereignisse auf Dateien innerhalb eines bestimmten Verzeichnisses oder auf einen ganzen Verzeichnisbaum zu warten. In solchen Situationen möchten wir möglicherweise die Überwachung bestimmter Dateien vermeiden oder einige von ihnen explizit einbeziehen. Um solche Aufgaben zu erledigen, können wir die Optionen --exclude
bzw. --include
verwenden. Beide verwenden einen regulären POSIX-Ausdruck als Argument.
Im folgenden Beispiel überwachen wir alle Dateien im Verzeichnis ~/.config
, mit Ausnahme derjenigen mit der Erweiterung ".xml":
$ inotifywait -m ~/.config --exclude ".*.xml"
Die Optionen --include
und --exclude
entsprechen den übergebenen Ausdrücken im Modus mit Berücksichtigung der Groß- und Kleinschreibung; beide haben jedoch eine Variante, die im Modus ohne Berücksichtigung der Groß- und Kleinschreibung funktioniert: --includei
bzw. --excludei
.
Schlüsse
In diesem Tutorial haben wir gelernt, wie man das inotify-tools-Paket auf einigen der am häufigsten verwendeten Linux-Distributionen installiert und wie man das Befehlszeilenprogramm inotifywait verwendet, um Ereignisse zu überwachen, die in Dateien und Verzeichnissen auftreten.