Service Status über systemd per D-Bus abfragen

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

Verwandte Artikel