[[Vorlage(Getestet, bionic, )]] {{{#!vorlage Wissen [:Terminal: Ein Terminal öffnen] [:systemd_Unit: Grundlage von Systemd-Units] [:systemctl: Steuerung von Systemd-Units via systemctl] [:mit Root-Rechten arbeiten:] }}} Mit Hilfe von [:systemd:] Path-Units können Dateien oder Verzeichnisse auf Änderungen hin überwacht werden. Tritt ein definiertes Ergebnis wie z.B. das Anlegen einer Datei ein, wird eine [:systemd/Service Units:Service-Unit] ausgeführt. Eine minimale Path-Unit sieht z.B. wie folgt aus: {{{[Unit] # Abschnitt wird im Artikel systemd/Units beschrieben [Path] PathExists=/home/BENUTZER/Verzeichnis/ Unit=NAME_DER_SERVICE_UNIT.service [Install] # Abschnitt wird im Artikel systemd/Units beschrieben }}} Obligatorisch für Path-Units ist die Sektion `Path`. Darin muss eine [#Direktiven Direktive] wie im Beispiel `PathExists=` stehen, gefolgt vom einem absoluten Pfad, der überwacht werden soll. Unter `Unit=` wird angegeben, welche Service-Units ausgeführt werden soll. Nach dem Anlegen einer neuen Path-Unit muss diese [:systemd/Units/#Selbst-angelegte-Units-aktivieren: aktiviert] werden, damit sie beim nächsten Systemstart automatisch gestartet wird. Zur Überwachung von Dateien und Verzeichnissen nutzt systemd im Hintergrund das [wikipedia_en:Inotify:] Subsystems des Linux-Kernels. = Direktiven = In der Sektion `Path` können fünf verschiedenen Direktiven, welche unterschiedliche Überwachungen aktivieren, angegeben werden: {{{#!vorlage Tabelle <-2 rowclass="titel">Direktiven für die Path-Sektion +++ Direktive Erklärung +++ `PathExists=NAME_DATEI_ODER_VERZEICHNIS` Überwacht das Verzeichnis auf die Existenz einer Datei oder eines Verzeichnisses. Diese müssen nur existieren, ob sie leer sind oder Inhalt haben spielt keine Rolle. +++ `PathExistsGlob=MUSTER_FÜR_DATEI_ODER_VERZEICHNIS` Wie `PathExists`, allerdings kann ein Muster angegeben werden, auf das überwacht wird. So würde `*.txt` auf Dateien mit der Endung "txt" überwachen oder `ab*` auf alle Dateien oder Verzeichnisse, die mit "ab" beginnen. +++ `PathChanged=NAME_DATEI_ODER_VERZEICHNIS` Überwacht Dateien auf Änderung, führt die auszuführende Service-Units aber erst aus, wenn die überwachte Datei wieder geschlossen wird. +++ `PathModified=NAME_DATEI_ODER_VERZEICHNIS` Wie `PathChanged`, führt die auszuführende Service-Units aber bereits aus, wenn der Inhalt der Datei geändert wurde, ohne das diese geschlossen wurde. +++ `DirectoryNotEmpty=NAME_DES_VERZEICHNISSES` Überwacht ein Verzeichnis und führt die auszuführende Service-Unit aus, sobald im Verzeichnis eine Datei angelegt wird. }}} Die Direktiven PathExists, PathExistsGlob, PathChanged und PathModified machen grundsätzlich keinen Unterschied zwischen Dateien und Verzeichnissen. D.h. eine Direktive {{{ PathExists=/home/BENUTZER/foo }}} würde die auszuführende Service-Unit ausführen, wenn im Verzeichnis '''/home/BENUTZER''' eine Datei oder ein Verzeichnis namens '''foo''' angelegt würde. Nutzt man eine Direktive wie {{{ PathExistsGlob=/home/BENUTZER/verzeichnisname/*txt }}} und im Verzeichnis '''/home/BENUTZER/verzeichnisname/''' existiert schon z.B. die Datei '''foo.txt''', wenn noch eine weitere Datei '''bar.txt''' angelegt wird, dann wird die auszuführende Service-Units zweimal ausgeführt, also für jede passende Datei ein Mal. == weitere Direktiven == In der Path-Sektion können außerdem noch die folgenden Direktiven angegeben werden: {{{#!vorlage Tabelle <-2 rowclass="titel">weitere Direktiven für die Path-Sektion +++ Direktive Erklärung +++ `Unit=NAME_DER_UNIT` Es wird die Service-Unit `NAME_DER_UNIT.service` ausgeführt. Wird diese Direktive nicht angegeben, wird automatisch nach einer Service-Unit geschaut, die den gleichen Namen wie die Path-Unit hat. Heißt die Path-Unit z.B. '''ueberwachung.path''', dann würde versucht, die Service-Unit '''ueberwachung.service''' auszuführen. +++ `MakeDirectory=` Als Argumente sind `true` oder `false` erlaubt, `false` ist die Voreinstellung. Mit dieser Direktive wird festgelegt, ob das zu überwachende Verzeichnis angelegt werden soll, falls dieses nicht existiert. +++ `DirectoryMode=MODUS` Ist `MakeDirectory=true` gesetzt, können mit der Direktive `DirectoryMode=` [:Rechte:] festgelegt werden. `MODUS` muss in der oktalen Notation angeben werden, die Voreinstellung ist `755`. }}} = Links = * [https://www.freedesktop.org/software/systemd/man/systemd.path.html Dokumentation] {en} zu systemd Path Units #tag:System, systemd, Dateisystem