[[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
+++
<rowclass="kopf">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
+++
<rowclass="kopf">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