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-toolsDas 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_profileSobald wir den Befehl von einem anderen Terminalfenster aus starten, werden wir über ein "OPEN"-Ereignis benachrichtigt und inotify wird beendet:
/home/doc/.bash_profile OPENWenn 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_profileDa 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_profileDas Ereignis wird wie erwartet benachrichtigt:
/home/doc/.bash_profile MODIFYDie Ereignisse, auf die wir lauschen können, sind in der folgenden Tabelle aufgeführt, wie im Handbuch des Dienstprogramms beschrieben:
| Ereignis | Beschreibung |
|---|---|
| Zugang | Es wurde aus einer überwachten Datei oder einer Datei innerhalb eines überwachten Verzeichnisses gelesen. |
| modifizieren | 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. |
| schließen_schreiben | Eine überwachte Datei oder eine Datei in einem überwachten Verzeichnis wurde geschlossen, nachdem sie im beschreibbaren Modus geöffnet wurde. Dies bedeutet nicht zwangsläufig, dass in die Datei geschrieben wurde. |
| Jetzt schließen | Eine überwachte Datei oder eine Datei in einem überwachten Verzeichnis wurde geschlossen, nachdem sie im schreibgeschützten Modus geöffnet wurde. |
| schließen | 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 Close-Ereignisse als eines von diesen ausgegeben, nicht als CLOSE. |
| offen | Eine überwachte Datei oder eine Datei innerhalb eines überwachten Verzeichnisses wurde geöffnet. |
| gezogen nach | 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. |
| gezogen_von | 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. |
| bewegen | 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. |
| selbst bewegen | Eine überwachte Datei oder ein überwachtes Verzeichnis wurde verschoben. Nach diesem Ereignis wird die Datei oder das Verzeichnis nicht mehr überwacht. |
| schaffen | Eine Datei oder ein Verzeichnis wurde in einem überwachten Verzeichnis erstellt. |
| löschen | Eine Datei oder ein Verzeichnis in einem überwachten Verzeichnis wurde gelöscht. |
| Selbst löschen | 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. |
| aushängen | 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 existiert, sobald eines der überwachten Ereignisse eintritt.
Wenn wir möchten, dass der Befehl weiterhin auf Ereignisse wartet, 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 modeAusschließ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 hören. 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 stimmen mit den übergebenen Ausdrücken überein, wobei die Groß-/Kleinschreibung beachtet wird. Beide haben jedoch eine Variante, die ohne Berücksichtigung der Groß- und Kleinschreibung arbeitet: --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.
