inotify
Dieser Artikel wurde für die folgenden Ubuntu-Versionen getestet:
Dieser Artikel ist mit keiner aktuell unterstützten Ubuntu-Version getestet! Bitte teste diesen Artikel für eine Ubuntu-Version, welche aktuell unterstützt wird. 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
. Zur genauen Benutzung wird auf die Manpage verwiesen.
Links¶
Incron - auf inotify aussetzender Dienst, mit dem Skripte bei Änderungen an Dateien ausgeführt werden können