Gruppieren von systemd-Diensten

10

Ich habe ungefähr ein halbes Dutzend .serviceDateien für die verschiedenen Teile geschrieben, aus denen das System besteht, an dem ich arbeite. Es ist nützlich, das gesamte System stückweise starten zu können, aber ich hätte auch gerne eine einzige Einheit, die das gesamte System in einem Aufruf startet systemctl.

Was ist der beste Weg, dies zu tun?

Magnus
quelle

Antworten:

10

Sie möchten eine Zieleinheit , bei der alle Serviceeinheiten als Wants=Abhängigkeiten aufgeführt sind. Dann starten Sie es mit systemctl start unitname.target. (Stellen Sie sicher, dass Sie systemctl isolatehier nicht verwenden. Dadurch wird alles heruntergefahren, außer dem, was im Abhängigkeitsbaum Ihrer Dienste enthalten ist, den Sie vermutlich nicht möchten.)

Tom Hunt
quelle
Alternativ können Sie den WantedBySchlüssel im [Install]Abschnitt verwenden und ein bereits vorhandenes Ziel notieren. Wenn Sie beispielsweise möchten, dass Ihre Dienste immer gestartet werden, bevor sich andere Benutzer anmelden können, verwenden Sie multi-user.target.
Saiarcot895
Ja, der Wants=Zieltyp mit der Auflistung aller Dienste scheint zum Starten ausreichend zu sein , ich kann jedoch keine Möglichkeit finden, das Stoppen und Neustarten mithilfe eines Zieltyps zum Laufen zu bringen . Gibt es einen Typ, der das erlaubt?
Magnus
Magnus, hast du jemals eine gute Lösung dafür gefunden?
Sam Hendley
2
Sam, Magnus: Es sieht aus wie die wollte Dienste zu stoppen von einem .targetkann getan werden , indem StopWhenUnneeded=yesin jedem der .serviceDateien. superuser.com/questions/470153/...
jonnor
1
In meinem speziellen Fall kann ich die systemd-Tools verwenden, die das Globbing handhaben :) Zum Starten verwende ich also a .targetund zum Stoppen verwende ich systemctl stop foo.\*(da alle beteiligten Dienste Dienstdateien haben, die mit wit beginnen foo.).
Magnus
2

Haben Sie versucht, PartOfdie Untereinheiten der Zielgruppe zusätzlich zum WantsZiel zu verwenden? Bsp.: PartOf=foo.targetIn foo-sub1.serviceund Wants=foo-sub1.service foo-sub2.servicein foo.target. Ich habe es gerade versucht und konnte alle meine Untereinheiten starten und stoppen, indem ich das Ziel startete und stoppte.

PartOf =

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.

Wenn PartOf = b.service für a.service verwendet wird, wird diese Abhängigkeit in der Eigenschaftsliste von b.service als ConsistsOf = a.service angezeigt. ConsistsOf = Abhängigkeit kann nicht direkt angegeben werden.

Benny Jobigan
quelle
Willkommen bei U & L! Wenn Ihr Beitrag keine Antwort auf die Frage enthält, sollte er im Kommentarbereich unter der Frage veröffentlicht werden.
Yurij Goncharuk
Dies bietet die andere Hälfte der Antwort von Tom Hunt - die Möglichkeit, eine ganze Gruppe von Diensten zu stoppen.
Benny Jobigan