Wie kann man alle Einheiten stoppen, die zum selben Ziel gehören?

9

Ich frage mich, wie ich alle Einheiten stoppen kann, die durch dasselbe Ziel gruppiert sind.

Mein Setup ist wie folgt. Ich habe mehrere Gerätekonfigurationsdateien, die lauten:

[Unit]
...

[Service]
...

[Install]
WantedBy=mycustom.target

Wenn ich renne

# systemctl start mycustom.target

Die Einheiten, die "gesucht werden", mycustom.targetstarten korrekt. Jetzt möchte ich auch alle Einheiten stoppen können, die von gewünscht werden mycustom.target. Ich habe es versucht:

# systemctl stop mycustom.target

Dies macht jedoch nichts. Gibt es eine Möglichkeit, dies zum Laufen zu bringen, ohne alle Einheiten stoppen zu müssen, die (explizit) von demselben Ziel gewünscht werden?

Kris
quelle

Antworten:

26

Verwenden Sie die PartOf=Richtlinie.

Konfiguriert Abhängigkeiten ähnlich wie Requires =, beschränkt sich jedoch auf das Stoppen und Neustarten von Einheiten. Wenn systemd die hier aufgeführten Einheiten stoppt oder neu startet, wird die Aktion an diese Einheit weitergegeben. Beachten Sie, dass dies eine Einwegabhängigkeit ist. Änderungen an dieser Einheit wirken sich nicht auf die aufgelisteten Einheiten aus.

PartOf=mycustom.target

betonimig
quelle
1
Soll ich es mit kombinieren StopWhenUnneededoder ist es impliziert?
PSSGCSim
Es scheint, dass StopWhenUnneededdies bei der Verwendung nicht erforderlich ist PartOf. @PSSGCSim
Gary van der Merwe
9

Bearbeiten: Die PartOf=Richtlinie, die zum Zeitpunkt des Schreibens dieser Antwort noch nicht existierte, ist eine bessere Lösung. Siehe eine andere Antwort für Details.

Es gibt zwei Möglichkeiten: eine implizite und eine explizite.

Erster Weg - StopWhenUnneeded=

Der erste Weg ist die Verwendung der StopWhenUnneeded=Richtlinie. Wenn eine Einheit hat StopWhenUnneeded=yes, wird es automatisch gestoppt , wenn es keine aktive Einheit wird die Wants=/ Requires=das Gerät in Frage. Daher:

  • Dies funktioniert nur, wenn diese Einheiten WantedBy= nur von sind mycustom.target;
  • Sie können keine dieser Einheiten manuell systemctl start myunit.servicestarten (dh sie werden gestartet und sofort danach gestoppt).

Zweiter Weg - eine Shell-Pipeline

Die zweite Möglichkeit besteht darin, eine einfache Shell-Pipeline systemctl show -pzu erstellen , mit der die Abhängigkeitsliste von extrahiert wird mycustom.target.

Insbesondere systemctl show UNITwerden alle Eigenschaften einer Einheit in einer KEY = VALUE-Form systemctl show -p PROPERTIES UNITangezeigt und das Gleiche getan, wodurch die Menge der angezeigten Eigenschaften begrenzt wird. Damit:

systemctl stop -- $(systemctl show -p Wants mycustom.target | cut -d= -f2)
intelfx
quelle