ubuntuusers.de

inotify

Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:


Du möchtest den Artikel für eine weitere Ubuntu-Version testen? Mitarbeit im Wiki ist immer willkommen! Dazu sind die Hinweise zum Testen von Artikeln zu beachten.

Zum Verständnis dieses Artikels sind folgende Seiten hilfreich:

Mit inotify werden Veränderungen an Dateien oder Verzeichnissen überwacht. Das "i" steht dabei für Inode. Die Überwachungen werden ressourcenschonend vom Kernel an das Clientprogramm weitergegeben. Inotify soll das ältere Programm dnotify ersetzen und verbessern. Ein Vorteil ist beispielsweise, dass auch einzelne Dateien statt ganzer Verzeichnisse überwacht werden können.

Installation

Um die Funktionalität von inotify in der Shell[2] benutzen zu können, muss folgendes Paket installiert[1] werden, welches die Programme inotifywait und inotifywatch enthält:

  • inotify-tools (universe)

Befehl zum Installieren der Pakete:

sudo apt-get install inotify-tools 

Oder mit apturl installieren, Link: apt://inotify-tools

Anbindungen für weitere Skriptsprachen finden sich ebenfalls in den Paketquellen.

inotifywait

Inotifywait wartet auf Veränderungen am Dateisystem und gibt diese dann aus. Allgemein lautet die Syntax:

inotifywait  [-hcmrq]  [-e  <event> ] [-t <seconds> ] [--format <fmt> ] [--timefmt <fmt> ] <file> [ ... ] 

Optionen
Option Beschreibung
-h, --help Hilfe
<file> Die zu überwachenden Dateien oder Verzeichnisse. Diese müssen existieren.
@<file> Diese Dateinamen werden von der Überwachung ausgeschlossen.
--fromfile <file> Gibt eine Datei an, die Zeilenweise die zu überwachenden Dateien oder Verzeichnisse enthält. Einträge, die mit @ beginnen, werden ausgeschlossen. Um von der Standardeingabe zu Lesen muss - als <file> angegeben werden.
-m, --monitor Lässt inotifywait nach jedem Event weiterlaufen. Standardverhalten ist die Beendigung nach dem ersten Event.
-r, --recursive Überwacht auch alle Unterverzeichnisse eines angegebenen Verzeichnisses. Symbolische links werden nicht dereferenziert. Auch neu angelegte Verzeichnisse werden überwacht. Es kann lange dauern, bis alle Überwachungen eines großen Verzeichnisbaums initialisiert wurden. Außerdem kann die Maximalzahl zu überwachender Verzeichnisse erreicht werden.
-q, --quiet Einmalig angegeben erscheinen weniger Ausgaben, speziell nicht, wenn alle Überwachungen fertig sind. Doppelt angegeben wird außer fatalen Fehlern gar nichts ausgegeben.
--exclude <pattern> Events zu Dateinamen, die auf den regulären Ausdruck <pattern> passen (case sensitive), werden nicht beachtet.
--excludei <pattern> Events zu Dateinamen, die auf den regulären Ausdruck <pattern> passen (case insensitive), werden nicht beachtet.
-t <seconds>, --timeout <seconds> Beenden, wenn in der angegebenen Zeitspanne kein Event auftrat. Standard ist unendlich lange auf Events zu warten.
-e <event>, --event <event> Nur auf bestimmte der nachfolgend aufgeführten Events reagieren. Diese Option kann mehrfach angegeben werden. Wird sie weggelassen, so wird auf alle Events reagiert.
-c, --csv Die Ausgabe wird durch Kommas getrennt. Das kann hilfreich sein, wenn Dateinamen Leerzeichen enthalten.
--format <fmt> Legt das Ausgabeformat fest. Es werden nur maximal ca. 4000 Zeichen ausgegeben.
%w wird durch den Verzeichnispfad ersetzt
%f wird durch den Dateinamen ersetzt, falls einer relevant ist
%e wird durch die Events ersetzt, mehrere Events werden durch Komma getrennt
%Xe wird durch die Events ersetzt, mehrere Events werden durch das Zeichen an der Stelle X ersetzt
%T wird durch die aktuelle Zeit ersetzt, das Format kann mit --timefmt festgelegt werden
--timefmt <fmt> Legt das Zeitformat für %T fest, wie in strftime.

Events
Event Beschreibung
access Eine Datei wurde gelesen.
modify Eine Datei wurde geändert.
attrib Die Metadaten einer Datei wurden geändert (Zeitstempel, Rechte, erweiterte Attribute).
close_write Eine Datei wurde geschlossen nachdem sie zum schreiben geöffnet wurde, sie muss aber nicht verändert worden sein.
close_nowrite Eine Datei wurde geschlossen nachdem sie schreibgeschützt geöffnet wurde.
close wie close_write und close_nowrite zusammen
open Eine Datei wurde geöffnet.
moved_to Eine Datei oder ein Verzeichnis wurde in ein zu überwachendes Verzeichnis verschoben oder im Verzeichnis verschoben.
moved_from Eine Datei oder ein Verzeichnis wurde aus oder in einem überwachten Verzeichnis verschoben.
move wie moved_to und moved_from zusammen
move_self Eine überwachte Datei oder ein überwachtes Verzeichnis wurde verschoben. Danach wird die Überwachung abgeschaltet.
create Eine Datei wurde erstellt.
delete Eine Datei wurde gelöscht.
delete_self Eine überwachte Datei oder ein überwachtes Verzeichnis wurde gelöscht. Danach wird die Überwachung abgeschaltet.
unmount Das Dateisystem, auf dem sich die Überwachung befand, wurde ausgehängt. Danach wird die Überwachung abgeschaltet. Dieses Event kann auch auftreten, wenn es nicht explizit überwacht wurde.

Wenn die Ausgabe nicht durch die Optionen -q oder --format beeinflusst wurde, dann werden auf der Standardausgabe zeilenweise folgende Informationen ausgegeben:

watched_name EVENT_NAMES event_filename 

Dabei enthält watched_name den Namen des überwachten Verzeichnisses (auf / endend) bzw. der überwachten Datei. EVENT_NAMES wird durch die aufgetretenen Events (getrennt durch Kommas) ersetzt. Wenn das Event in einem überwachten Verzeichnis auftrat, dann wird in event_filename der Name der betroffenen Datei ausgegeben.

Spezielle Zeichen (beispielsweise Leerzeichen) in Verzeichnis- und Dateinamen werden nicht gesondert behandelt, was das Weiterverarbeiten der Ausgabe von inotifywait kompliziert gestalten kann. Auf die Standardfehlerausgabe werden Diagnoseinformationen geschrieben.

Beispiele

Dieser Befehl führt jedes mal make aus, wenn eine Datei im angegebenen Verzeichnis verändert wurde. inotifywait wird nach jedem auftreten eines Events beendet und dann in der Schleife neu gestartet:

1
while true; do inotifywait -e modify /pfad/zum/verzeichnis/ && make; done

Events, die auftreten während make ausgeführt wird, werden nicht erkannt.

Die nächste Schleife gibt jedes mal einen Text aus, wenn eine Datei im angegebenen Verzeichnis oder einem Unterverzeichnis erstellt wurde. Hier wird inotifywait nie beendet. Die Ausgabe wird in der Schleife eingelesen und weiter benutzt.

1
2
3
4
inotifywait -mrq -e create --format %w%f /pfad/zum/verzeichnis/ | while read FILE
do
    echo "Die Datei $FILE wurde gerade erstellt."
done

Hier wird kein Event ausgelassen da inotifywait die ganze Zeit läuft.

Sinnvoll kann es sein, vor der Überwachung die zu überwachenden Dateien und Verzeichnisse auf Existenz zu überprüfen, da inotifywait sonst nicht startet:

1
2
3
4
5
6
7
watchnames=''
[ -d /pfad/zum/verzeichnis/ ] && watchnames="$watchnames /pfad/zum/verzeichnis/"
[ -f /pfad/zur/datei ] && watchnames="$watchnames /pfad/zur/datei"
inotifywait -mrq -e modify -e attrib --format %w%f $watchnames | while read FILE
do
    echo "Die Datei $FILE wurde gerade bearbeitet oder ihre Attribute wurden geändert."
done

Probleme

  • Wenn viele Verzeichnisse überwacht werden sollen kann die Einrichtung dieser Überwachungen einige Zeit in Anspruch nehmen. Während dieser Zeit finden keine Reaktionen auf Ereignisse statt.

  • Sollen bei neu erstellten Dateien (create) die Zugriffsrechte geändert werden, so kann dies fehlschlagen, wenn die Erstellung der Datei erst nach dem Ändern der Zugriffsrechte fertig ist.

  • Es kann schnell zu Endlosschleifen kommen, wenn man Verzeichnisse auf bestimmte Events überwacht und dann als Reaktion solch ein Event im betroffenen Verzeichnis auslöst.

Alternativen

Der Einsatz von inotifywait ist nicht immer sinnvoll. Das folgende Beispiel (entnommen aus der Manpage von inotifywait)

1
2
3
4
5
6
7
while inotifywait -e modify /var/log/messages
do
    if tail -n1 /var/log/messages | grep httpd
    then
        kdialog --msgbox "Apache needs love!"
    fi
done

kann auch durch dieses Konstrukt mit tail -F ersetzt werden:

1
2
3
4
tail -F /var/log/messages | grep --line-buffered httpd | while read
do
    kdialog --msgbox "Apache needs love!"
done

inotifywatch

Inotifywatch überwacht ebenfalls Veränderungen am Dateisystem und gibt diese dann zusammengefasst als Tabelle aus. Die Befehlsoptionen ähneln denen von inotifywait. Details findet man in der Manpage zu inotifywatch.

Im folgenden Beispiel wird das Verzeichnis /home/NUTZER/code inklusive Unterverzeichnissen auf Zugriffe und Modifikation von Dateien überwacht:

inotifywatch -v -e access -e modify -t 60 -r /home/NUTZER/code/ 

Die Ausgabe sieht dann z.B. so aus:

Establishing watches...
Setting up watch(es) on /home/NUTZER/code/
OK, /home/NUTZER/code/ is now being watched.
Total of 1377 watches.
Finished establishing watches, now collecting statistics.
Will listen for events for 60 seconds.
total  access  modify  filename
22     18      4       /home/NUTZER/code/
6      6       0       /home/NUTZER/code/fletdev/
3      3       0       /home/NUTZER/code/fletdev/bin/
2      2       0       /home/NUTZER/code/rechnen/

Diese Revision wurde am 9. Juni 2023 14:28 von noisefloor erstellt.
Die folgenden Schlagworte wurden dem Artikel zugewiesen: System, Shell