Das heutige systemd
liest seine Initialisierungskonfiguration für jeden Daemon aus einer Sammlung von Unit-Dateien , die oft nur Einheiten genannt werden . Mit Pfadeinheiten können Sie Dateien und Verzeichnisse auf bestimmte Ereignisse überwachen. Wenn ein bestimmtes Ereignis eintritt, eine Dienstleistungseinheit ausgeführt und trägt normalerweise den gleichen Namen wie die Pfadeinheit. Wie das funktioniert, zeige ich an einem einfachen Beispiel.
Nehmen wir an, wir möchten eine Datei überwachen. Immer wenn die Datei nach einem Schreibvorgang geschlossen wird, sollte ein bestimmtes Skript gestartet werden.
Die Pfadeinheit:example.path
Im Verzeichnis /etc/systemd/system/
wir erstellen die Datei example.path
mit folgendem Inhalt:
[Unit]
Description=Monitor the file for changes
[Path]
PathChanged=/home/john/testfile
Unit=example.service
[Install]
WantedBy=multi-user.target
Im [Path]
Abschnitt, PathChanged=
gibt den absoluten Pfad zur zu überwachenden Datei an, während Unit=
gibt an, welche Diensteinheit ausgeführt werden soll, wenn sich die Datei ändert. Diese Einheit (example.path
) sollte gestartet werden, wenn sich das System im Mehrbenutzermodus befindet.
Als Nächstes erstellen wir die entsprechende Diensteinheit example.service
in /etc/systemd/system/
.
Die Diensteinheit:example.service
Wenn die Datei testfile
ändert (was bedeutet, dass es sowohl geschrieben als auch geschlossen wird), wird die folgende Diensteinheit aufgerufen, um das angegebene Skript auszuführen:
[Unit]
Description=Executes script when a file has changed.
[Service]
Type=simple
ExecStart=/home/john/script.sh
[Install]
WantedBy=multi-user.target
In diesem Beispiel die Datei script.sh
enthält nur den folgenden Code:
#!/bin/bash
echo "file changed" >/home/john/output.txt
Um die Path-Unit zu testen, müssen diese beiden neuen Units aktiviert werden, also starte:
$ sudo systemctl enable example.{path,service}
$ sudo systemctl start example.path
Wenn Sie nun die Datei testfile
, die entsprechende Service Unit wird ausgeführt und die Datei output.txt
wird im Benutzer john
erstellt Home-Verzeichnis von .
Die folgende unvollständige und nicht erschöpfende Liste enthält einige Beispiele, bei denen Pfadeinheiten Ihren Sysadmin-Tag etwas einfacher machen könnten:
- Ereignisgesteuerte Datenverarbeitung starten.
- Dateien unter
/etc
überwachen , und senden Sie eine Benachrichtigung, wenn Änderungen vorgenommen werden. - Überwachen Sie den
import
Ordner für neue Dateien und starten Sie die Verarbeitung.
Dinge, die Sie beachten sollten
Bei meinen Tests mit Pfadeinheiten ist mir aufgefallen, dass unter Umständen nicht alle Ereignisse abgefangen werden. Richten Sie beispielsweise eine Pfadeinheit ein, um einen Pfad auf Änderungen zu überwachen, und führen Sie dann den folgenden Befehl aus:
$ touch /path/file && rm /path/file
Ich würde erwarten, dass die Diensteinheit zweimal ausgeführt wird, hier:das erste Mal für den touch
Befehl und das zweite Mal für den rm
Befehl. Ich habe einen Bugzilla-Bericht eingereicht, um zu sehen, ob dieses Problem auf das Design oder einen Fehler zurückzuführen ist, der behoben werden kann.
Quellen und verwandte Links
Wenn Sie mehr über systemd
erfahren möchten Units, einschließlich Pfad- und Service-Units, werfen Sie einen Blick auf die folgenden Manpages:
- systemd.unit (5)
- systemd.path (5)
- systemd.service (5)
Wenn Sie an den Ergebnissen meines Fehlerberichts interessiert sind, können Sie ihn hier verfolgen:
Fehler 1722627 – Path Unit erfasst nicht jedes Ereignis