Systemd: Starten Sie alle Instanzen eines instanziierten Dienstes auf einmal neu

17

Ich benutze die nette Funktion von systemd: Instantiated Services.

Gibt es eine einfache Möglichkeit, alle instanziierten Dienste mit einem Aufruf neu zu laden?

Beispiel: Ich möchte nicht alle so ausführen:

systemctl restart autossh@foo
systemctl restart autossh@bar
systemctl restart autossh@blu

Ich habe es versucht, aber das funktioniert nicht

systemctl restart autossh@*

Verwandte Themen: Starten Sie N Prozesse mit einer systemd-Servicedatei

Aktualisieren

Zuerst war ich von Instantiated Services fasziniert, aber später wurde mir klar, dass das Ausführen eines Konfigurationsverwaltungstools wie Ansible sinnvoller ist. Ich habe gelernt: Halten Sie die Werkzeuge einfach. Viele Tools beginnen mit der Implementierung von Bedingungsprüfungen (if .. else ...) und Schleifen. Zum Beispiel Webserver oder Mailserver Konfiguration. Dies sollte jedoch auf einer anderen (oberen) Ebene gelöst werden: dem Konfigurationsmanagement. Siehe: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

guettli
quelle

Antworten:

23

Systemd (ab systemd-209) unterstützt Platzhalter, Ihre Shell versucht jedoch wahrscheinlich, diese zu erweitern. Verwenden Sie Anführungszeichen, um Platzhalter wörtlich an den Befehl systemctl / service zu übergeben:

systemctl restart 'autossh@*'
komisch
quelle
Funktioniert bei mir nicht: systemctl status 'autossh@*'Ausgabe: autossh@\x2a.service - ... Active: inactive (dead)Version:systemd 195
guettli
2
Globbing ist ab systemd 209 verfügbar: lists.freedesktop.org/archives/systemd-devel/2014-February/…
weirdan
Wenn Sie eine Menge von Diensten neu starten müssen, funktioniert die while-Schleife in guettlis Antwort besser, da der Platzhalter zu versuchen scheint, alle auf einmal neu zu starten. Getestet mit ~ 1000 php-fpm Diensten, stieg die Last auf 400 und ich musste den Server neu starten.
boutch55555
1
Funktioniert, wenn die Prozesse bereits ausgeführt werden, jedoch nicht, wenn sie nach der Aktivierung zum ersten Mal gestartet werden müssen. Sie können jedoch systemctl restart autossh@{1..2}(mit jedem N anstelle von 2) verwenden, was etwas weniger allgemein ist, aber es startet auch die Prozesse, wenn dies der Fall ist inactive (dead).
Giorgiosironi
7

Nicht schön, aber das funktioniert für Systeme mit einem alten Systemd:

systemctl list-units -t service --full| cut -d' ' -f1| grep mypattern | while read s; do systemctl restart $s; done

Natürlich ist die Lösung von oben answer ( systemctl restart 'autossh@*') besser.

guettli
quelle
Achtung: cutAnalysiert möglicherweise das falsche Feld, falls in der Ausgabe von Listeneinheiten Dienste fehlschlagen.
Juuso Ohtonen
5

@weirdan Antwort ist korrekt, aber für bestimmte Distributionen fehlt etwas.

Für Centos 7 und ähnliches können Sie Folgendes tun:

systemctl (start|stop|restart|status) my-service@*

ABER (start) funktioniert NUR, wenn Sie das Flag "--all" angeben:

systemctl (start) my-service@* --all

Andernfalls werden die Dienste nicht gefunden, da sie nicht vorhanden sind. Dies ist eine vom System vorgesehene Funktion.

Bei Ubuntu- basierten Systemen funktioniert dies ziemlich genau so, aber der Unterschied besteht darin, dass das Flag "--all" für alle systemctl-Argumente angegeben werden muss, da es sonst nichts bewirkt.

systemctl (start|stop|restart|status) 'my-service@*' --all
ku4eto
quelle
2

Ich weiß nicht, ob es eine Option für ein Platzhalterzeichen auf dem Terminal für systemd gibt. Was Sie tun können, ist das Hinzufügen eines Skripts zu Ihren systemd-Skripten.

Das% i würde den Trick machen, den ich denke, hängt aber damit zusammen, wie Sie die instanziierten Dienste skripten.

Hier finden Sie eine Erklärung , die als Spezifizierer bezeichnet wird

was zeigt, dass:

% n

vollständiger Gerätename

% p

Bei instanziierten Einheiten bezieht sich dies auf die Zeichenfolge vor dem Zeichen "@" des Einheitennamens. Bei nicht instanziierten Einheiten bezieht sich dies auf den Namen der Einheit, bei der das Typensuffix entfernt wurde.

%ich

Für instanziierte Einheiten: Dies ist die Zeichenfolge zwischen dem Zeichen "@" und dem Suffix des Einheitennamens

Ich beantworte Ihre Frage nicht direkt, aber für das, was Sie wohl erreichen wollen. Wenn Sie der Meinung sind, dass Ihre Lösung nach dieser Idee gefunden werden könnte, teilen Sie uns bitte Ihr systemd-Skript mit, damit wir sie eventuell mit Beispielen veranschaulichen und Ihnen möglicherweise sogar das endgültige Skript zur Verfügung stellen können.

Wenn Sie sicher sind, dass Sie Ihr eigenes Skript bearbeiten, um eine Lösung auf diese Weise zu finden, finden Sie hier ein Beispiel (ich zitiere es nicht, da ich nicht weiß, ob es für die Lösung relevant ist und zu spezifisch für das ist, was ich ' Ich schlage vor)

zündet
quelle