Systemd: Zrestartuj wszystkie instancje usługi utworzonej jednocześnie

17

Korzystam z przyjemnej funkcji systemd: Instantived Services.

Czy istnieje prosty sposób na ponowne załadowanie wszystkich połączonych usług za pomocą jednego połączenia?

Przykład: nie chcę działać tak:

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

Próbowałem tego, ale to nie działa

systemctl restart autossh@*

Powiązane: Uruchom N procesów za pomocą jednego pliku usługi systemowej

Aktualizacja

Najpierw byłem zafascynowany Instantived Services, ale później zdałem sobie sprawę, że uruchomienie narzędzia do zarządzania konfiguracją, takiego jak Ansible, ma większy sens. Nauczyłem się: Uprość narzędzia. Wiele narzędzi zaczyna implementować sprawdzanie warunków (jeśli ... else ...) i pętle. Na przykład konfiguracja serwerów WWW lub mailserver. Należy to jednak rozwiązać na innym (wyższym) poziomie: zarządzanie konfiguracją. Zobacz: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantised-units

guettli
źródło

Odpowiedzi:

23

Systemd (począwszy od systemd-209) obsługuje symbole wieloznaczne, jednak Twoja powłoka prawdopodobnie próbuje je rozwinąć. Używaj cudzysłowów, aby przekazywać symbole wieloznaczne do komendy systemctl / service dosłownie:

systemctl restart 'autossh@*'
dziwak
źródło
Nie działa dla mnie: systemctl status 'autossh@*'wyjście: autossh@\x2a.service - ... Active: inactive (dead)Wersja:systemd 195
guettli
2
Globbing jest dostępny począwszy od systemd 209: lists.freedesktop.org/archives/systemd-devel/2014- lutego /…
weirdan
Jeśli masz wiele usług do zrestartowania, pętla while w odpowiedzi guettli będzie działać lepiej, ponieważ wydaje się, że symbol wieloznaczny próbuje je wszystkie ponownie uruchomić jednocześnie. Testowany z ~ 1000 usługami php-fpm, obciążenie wzrosło do 400 i musiałem zrestartować serwer.
boutch55555
1
Działa, jeśli procesy są już uruchomione, ale nie, jeśli trzeba je uruchomić po raz pierwszy po ich włączeniu. Ale możesz użyć systemctl restart autossh@{1..2}(z dowolnym N zamiast 2), co jest nieco mniej ogólne, ale uruchomi również procesy, jeśli są inactive (dead).
giorgiosironi
7

Nie fajnie, ale działa to w systemach ze starym systemd:

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

Oczywiście rozwiązanie z powyższej odpowiedzi ( systemctl restart 'autossh@*') jest lepsze.

guettli
źródło
Uwaga: cutmoże przeanalizować niepoprawne pole w przypadku awarii usług w danych wyjściowych jednostek list.
Juuso Ohtonen,
5

@weirdan Odpowiedź jest poprawna, ale brakuje jej w niektórych dystrybucjach.

W przypadku Centos 7 i podobnych możesz:

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

ALE, (start) będzie działać TYLKO, jeśli podasz flagę „--all”:

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

W przeciwnym razie nie znajdzie usług, ponieważ one nie istnieją. Jest to zamierzona funkcja systemowa.

W systemach opartych na Ubuntu działa prawie w ten sam sposób, ale różnica polega na tym, że dla wszystkich argumentów systemctl należy podać flagę „--all”, w przeciwnym razie nic nie zrobi.

systemctl (start|stop|restart|status) 'my-service@*' --all
ku4eto
źródło
2

Nie wiem, czy istnieje opcja dla symbolu wieloznacznego na terminalu dla systemd. Możesz dodać jeden do skryptów systemowych.

Myślę, że% I zrobiłby lewę, ale jest związany ze sposobem, w jaki skrypt utworzyłeś instancję usług.

Możesz znaleźć wyjaśnienie tutaj określane jako specyfikatory

co pokazuje, że:

% n

pełna nazwa jednostki

% p

W przypadku jednostek tworzonych przez instancję odnosi się to do ciągu poprzedzającego znak „@” nazwy jednostki. W przypadku jednostek bez instancji odnosi się to do nazwy jednostki z usuniętym sufiksem typu.

%ja

W przypadku jednostek utworzonych: jest to ciąg między znakiem „@” a sufiksem nazwy jednostki. Nazwa jednostki

Nie odpowiadam bezpośrednio na twoje pytanie, ale dla tego, co myślę, że próbujesz osiągnąć. Jeśli uważasz, że Twoje rozwiązanie może zostać znalezione zgodnie z tym pomysłem, prosimy o udostępnienie skryptu systemowego, abyśmy mogli w końcu zilustrować przykładami, a może nawet dostarczyć ostateczny skrypt.

Jeśli masz pewność edycji własnego skryptu w celu znalezienia rozwiązania w ten sposób, oto przykład (nie będę go cytował, ponieważ nie wiem, czy jest on odpowiedni dla rozwiązania i jest zbyt specyficzny dla tego, co ja ”. m proponuję)

ignivs
źródło