PID der Abhängigkeit in systemd abrufen?

PID der Abhängigkeit in systemd abrufen?

Ich möchte eine systemd-Unit-Datei schreiben, die dem Exec-Befehl die PID einer ihrer Abhängigkeiten übergeben muss. In der Unit-Datei möchte ich Folgendes haben:

ExecStart=bar -p <PID of foo.service>
Requires=foo.service
After=foo.service

Gibt es eine Möglichkeit, die PID einer erforderlichen Abhängigkeit auf einfache Weise abzurufen? Ich konnte weder im Handbuch etwas dazu finden, noch ein Beispiel in einer der Unit-Dateien auf einem Ubuntu-Desktop.

Der Anwendungsfall besteht darin, eine einfache Unit-Datei zu erstellen, mit der der JProfiler-Daemon an einen Java-basierten Dienst angehängt werden kann, um Remote-Performance-Debugging durchzuführen. Der Befehl zum Anhängen des Profilers benötigt die PID der JVM.

Antwort1

Ausman systemctl:

-p,--property=

Beim Anzeigen von Einheiten-/Job-/Managereigenschaften mit demzeigenBefehl, beschränken Sie die Anzeige auf die im Argument angegebenen Eigenschaften. Das Argument sollte eine durch Kommas getrennte Liste von Eigenschaftsnamen sein,wie zum Beispiel " MainPID". [...]

So systemctl show -p MainPID foowird angezeigt MainPID=<pid>(und nicht nur die PID). Mit einem zusätzlichen --value(oder dem Kombinationsparameter -P(Großbuchstaben) für aktuelle genugsystemd) liefert lediglich den Wert:

--value

Drucken Sie beim Drucken von Eigenschaften mit „show“ nur den Wert und überspringen Sie den Eigenschaftsnamen und „=“. Siehe auch Option -P oben.

Hinzugefügt in Version 230.

Wenn also der Dienstfookann durch seine Haupt-PID identifiziert werden (d. h.: der Zielprozess ist eigentlich kein Unterprozess der Haupt-PID), dies könnte verwendet werden:

/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

Wenn nicht in einem eigenen Skript, kann manVerwenden Sie das Präfix :vor der ausführbaren Zeile, um jegliches Parsen zu vermeiden.systemd:

Präfix Wirkung
... ...
":" Wenn dem ausführbaren Pfad ein „:“ vorangestellt ist, wird die Umgebungsvariablenersetzung (wie weiter unten im Abschnitt „Befehlszeilen“ beschrieben) nicht angewendet.
... ...

Daher bleibt es in der Servicedatei gleich:

ExecStart=:/bin/sh -c 'pid=$(systemctl show --value -p MainPID foo); [ "$pid" -ne 0 ] && exec bar -p $pid || exit 1'

verwandte Informationen