
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 foo
wird 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'