So debuggen Sie systemd unit ExecStart

12

Ich bin gespannt, ob ich eine vollständig erweiterte ExecStart/ExecStopKommandozeile ausdrucken kann . Betrachten Sie folgendes Beispiel:

ExecStart=/usr/bin/java $OPTS_COMMON $OPTS $OPTS_LOG $OPTS_DEBUG some.class.Start --param1 ${PARAM1} --param2 ${PARAM2}

Ich habe ziemlich lange Befehlszeilen mit vielen Umgebungsvariablen. Wenn einige der Variablen falsch werden (z. B. durch Drop-In-Konfiguration), wird der Dienst möglicherweise überhaupt nicht gestartet. Ich sehe jedoch nirgendwo eine vollständig erweiterte Linie mit ersetzten Envs und habe Mühe herauszufinden, was falsch ist.

Ich hatte kein Glück, dies zu googeln, und bisher bestand die einzige Möglichkeit darin, die Einheitendatei so zu ändern, dass sie /usr/bin/echoanstelle des Dienstes selbst ausgeführt wird. Das ist aber etwas lästig. Oder noch ärgerlichere Lösung - überprüfen Sie jede Umgebungsvariable einzeln.

Gibt es eine Möglichkeit, systemd zu zwingen, mir zu zeigen, was tatsächlich versucht wird, ausgeführt zu werden?

Pystole
quelle

Antworten:

9

Leider gibt es keinen eingebauten Weg. Um den endgültigen ExecStart anzuzeigen, können Sie das Debuggen aktivieren. Bearbeiten Sie die Datei /etc/systemd/system.confund setzen Sie LogLevel=auf debug. Dann sehen Sie so etwas wie:

java.service About to execute: /usr/bin/java $OPTS_COMMON...Dies löst Ihr Problem nicht, aber es ist gut zu sehen, wie der Spezifizierer des Systems ersetzt wird. https://www.freedesktop.org/software/systemd/man/systemd.unit.html(specifiers)

Wenn Sie dem Ersetzen von Argumenten jedoch wirklich auf den Grund gehen möchten, müssen Sie hier nachsehen: https://github.com/systemd/systemd/blob/7ce9cc154576e342015eab8c1500790a9ededc01/src/core/execute.c#L2570

Umut
quelle
Ich hatte ein bisschen Angst, dass es keine Möglichkeit gibt, das zu tun. :/ Danke trotzdem.
Pystole
2

In der * .service-Datei im Abschnitt [Service]

ExecStartPre=/bin/bash -l -c 'echo "$OPTS_COMMON">/tmp/options.debug'
greenif
quelle