[[Vorlage(Getestet, jammy)]] {{{#!vorlage Wissen [:Pakete installieren: Installation von Programmen] [:Terminal: Ein Terminal öffnen] }}} [[Inhaltsverzeichnis(2)]] Mit [wikipedia_en:Inotify:inotify] werden Veränderungen an Dateien oder Verzeichnissen überwacht. Das "i" steht dabei für [wikipedia:Inode: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: {{{#!vorlage Paketinstallation inotify-tools, universe }}} 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: {{{#!vorlage Befehl inotifywait [-hcmrq] [-e ] [-t ] [--format ] [--timefmt ] [ ... ] }}} {{{#!vorlage Tabelle <-2 rowclass="titel"> Optionen +++ Option Beschreibung +++ `-h, --help` Hilfe +++ `` Die zu überwachenden Dateien oder Verzeichnisse. Diese müssen existieren. +++ `@` Diese Dateinamen werden von der Überwachung ausgeschlossen. +++ `--fromfile ` 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 `` 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 ` Events zu Dateinamen, die auf den regulären Ausdruck `` passen (case sensitive), werden nicht beachtet. +++ `--excludei ` Events zu Dateinamen, die auf den regulären Ausdruck `` passen (case insensitive), werden nicht beachtet. +++ `-t , --timeout ` Beenden, wenn in der angegebenen Zeitspanne kein Event auftrat. Standard ist unendlich lange auf Events zu warten. +++ `-e , --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 ` Legt das Ausgabeformat fest. Es werden nur maximal ca. 4000 Zeichen ausgegeben.[[BR]]`%w` wird durch den Verzeichnispfad ersetzt[[BR]]`%f` wird durch den Dateinamen ersetzt, falls einer relevant ist[[BR]]`%e` wird durch die Events ersetzt, mehrere Events werden durch Komma getrennt[[BR]]`%Xe` wird durch die Events ersetzt, mehrere Events werden durch das Zeichen an der Stelle `X` ersetzt[[BR]]`%T` wird durch die aktuelle Zeit ersetzt, das Format kann mit `--timefmt` festgelegt werden +++ `--timefmt ` Legt das Zeitformat für `%T` fest, wie in strftime. }}} {{{#!vorlage Tabelle <-2 rowclass="titel"> 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: {{{#!vorlage Befehl 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: {{{#!code bash 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. {{{#!code bash 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: {{{#!code bash 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 [:man:Manpage] von inotifywait) {{{#!code bash 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: {{{#!code bash 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 [:man:Manpage] zu inotifywatch. Im folgenden Beispiel wird das Verzeichnis '''/home/NUTZER/code''' inklusive Unterverzeichnissen auf Zugriffe und Modifikation von Dateien überwacht: {{{#!vorlage Befehl 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/ }}} = Links = * [:Incron:] - auf inotify aussetzender Dienst, mit dem Skripte bei Änderungen an Dateien ausgeführt werden können * [:systemd/Path Units:] - Überwachungsmechnismus von [:systemd:], der auf inotify aufsetzt * [github:rvoicilas/inotify-tools/wiki:Wiki zu inotify-tools] {en} #tag: System, Shell