Dez 292021
 

Manchmal macht es Sinn, den vollständigen Startup aus der Applikation dem systemd zu melden. Das ist besonders dann sinnvoll, wenn die Initialisierung der Applikation eine gewisse Weile dauert. Dazu wird der Service Type entsprechend umgestellt und aus der Applikation über das systemd-API eine Notification gemeldet, wenn die Initialisierung durchgeführt wurde.

Installation

Zuerst sollte das entsprechende Entwicklungspaket für den systemd installiert werden:

apt-get install libsystemd-dev

Programmatische Einbindung in die Applikation

Danach sollte in der Applikation folgender Header inkludiert werden:

#include <systemd/sd-daemon.h>

Die Benachrichtigung geht dann mit dem API-Call sd_notify() vonstatten. Dabei können mehrere Variablen übergeben werden, die durch Carriage Return ("\n") getrennt sein müssen. Die entscheidende Benachrichtigung für den systemd ist die Variable READY=1. Es kann dann noch eine zusätzliche Statusmeldung ergänzt werden, wie z.B.: "READY=1\nSTATUS=Started up.". Ein entsprechender Aufruf sieht wie folgt aus:

sd_notify(0, "READY=1\nSTATUS=Started up.");

Mit derselben API-Methode können vorher auch Statusmeldungen mitgeteilt werden wie z.B. Fortschrittsmeldungen beim Initialisieren. Dabei muss natürlich die Variable READY weggelassen werden. Die Variante sd_notifyf() erwartet einen printf()-Formatstring und kann den Aufruf wesentlich vereinfachen:

sd_notifyf(0, "STATUS=Initialize completed: %d %%", 55);

Das Herunterfahren kann mit der Variable STOPPING=1 angekündigt werden, die Variable READY=0 ist hingegen nicht definiert:

sd_notify(0, "STOPPING=1");

Abschließend muss noch die Linker-Option -lsystemd ergänzt werden, um die systemd API nutzen zu können.

Startkonfiguration

Damit systemd auch die Benachrichtigungen auswertet, muss der Service Type in der Service-Beschreibungsdatei auf notify gesetzt werden:

...
[Service]
type=notify
...

Referenzen:

Sorry, the comment form is closed at this time.