Im Rahmen einer Überwachung soll geprüft werden, ob ein Dienst unter Linux läuft oder wegen eines Fehlers gestoppt wurde. In dem folgenden Artikel werden die Grundlagen zur Abfrage des aktuellen Status eines Services über systemd per D-Bus gezeigt.
In den Beispiel wird exemplarisch der docker Service verwendet.
Der aktuelle Status kann zum Beispiel per systemctl
über die Konsole abgefragt werden.
$ systemctl status docker
● docker.service - Docker Application Container Engine
Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor preset: disabled)
Active: active (running) since Thu 2018-12-12 21:18:15 CET; 2s ago
Docs: https://docs.docker.com
Main PID: 1277 (dockerd)
Tasks: 22 (limit: 4707)
Memory: 202.3M
CGroup: /system.slice/docker.service
├─1277 /usr/bin/dockerd -H fd://
└─1285 containerd --config /var/run/docker/containerd/containerd.toml --log-level info
Diese Ausgabe soll jedoch, laut Aussage von Lennart Poettering dem Initiator und Maintainer von systemd, nicht in Skripten oder zur Automatisierung verwendet werden. Zu Bevorzugen ist die Abfrage über D-Bus, weil darüber fast auf die gesamte API von systemd zugegriffen werden kann.
Now, for scripting languages I am pretty sure the bus APIs are the best option. The largest part of our APIs is exposed via dbus.
Quelle: Kommentar auf GitHub vom 8. Juni 2015
Mit dem Befehl busctl
können zum Beispiel Befehle an den D-Bus gesendet oder Informationen abgefragt werden.
Um den aktuellen Status des docker Services abzufragen, muss zunächst das entsprechende Objekt für die Abfrage geladen werden.
$ busctl call org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager LoadUnit s "docker.service"
o "/org/freedesktop/systemd1/unit/docker_2eservice"
Die gelieferte Information kann anschließend für die Abfrage des aktuellen Status verwendet werden.
$ busctl get-property org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/docker_2eservice org.freedesktop.systemd1.Unit ActiveState
s "active"
$ busctl get-property org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/docker_2eservice org.freedesktop.systemd1.Unit SubState
s "running"
Neben den abgefragten Informationen stehen noch wesentlich mehr zur Verfügung. Eine Liste der Werte wird durch den Aufruf des folgenden Befehls ausgegeben.
$ busctl introspect org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/docker_2eservice org.freedesktop.systemd1.Unit
Links
- Webseite: The D-Bus API of systemd/PID 1 (englisch)
- Webseite: systemd System and Service Manager (englisch)
- Webseite: docker (englisch)