Systemd: riavvia contemporaneamente tutte le istanze di un servizio istanziato


17

Uso la simpatica funzionalità di systemd: Instantiated Services.

Esiste un modo semplice per ricaricare tutti i servizi istanziati con una chiamata?

Esempio: non voglio eseguire tutto in questo modo:

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

Ho provato questo, ma questo non funziona

systemctl restart autossh@*

Correlati: avviare N processi con un file di servizio systemd

Aggiornare

In primo luogo sono stato affascinato da Instantiated Services, ma in seguito mi sono reso conto che eseguire uno strumento di gestione della configurazione come Ansible ha più senso. Ho imparato: mantieni gli strumenti semplici. Molti strumenti iniziano a implementare il controllo delle condizioni (se .. altro ...) e i loop. Ad esempio server web o congfigurazione mailserver. Ma questo dovrebbe essere risolto a un diverso livello (superiore): gestione della configurazione. Vedi: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

Risposte:


23

Systemd (a partire da systemd-209) supporta i caratteri jolly, tuttavia è probabile che la shell stia cercando di espanderli. Utilizzare le virgolette per passare i caratteri jolly al comando systemctl / service alla lettera:

systemctl restart 'autossh@*'

Per me non funziona: systemctl status 'autossh@*'output: autossh@\x2a.service - ... Active: inactive (dead)Versione:systemd 195
guettli

2
Globbing è disponibile a partire da systemd 209: lists.freedesktop.org/archives/systemd-devel/2014-Fe febbraio

Se hai molti servizi da riavviare, il ciclo while nella risposta di guettli funzionerà meglio, poiché il carattere jolly sembra provare a riavviarli tutti in una volta. Testato con ~ 1000 servizi php-fpm, il carico è salito a 400 e ho dovuto riavviare il server.
boutch55555,

1
Funziona se i processi sono già in esecuzione, ma non se devono essere avviati per la prima volta dopo essere stati abilitati. Ma puoi usare systemctl restart autossh@{1..2}(con qualsiasi N invece di 2) che è leggermente meno generale ma avvierà anche i processi se lo sono inactive (dead).
giorgiosironi,

7

Non carino, ma funziona con sistemi con un vecchio systemd:

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

Naturalmente la soluzione sopra answer ( systemctl restart 'autossh@*') è migliore.


Attenzione: cutpotrebbe analizzare il campo sbagliato nel caso in cui ci siano servizi falliti nell'output delle unità di elenco.
Juuso Ohtonen,

5

@weirdan La risposta è corretta, ma manca qualcosa per alcune distribuzioni.

Per Centos 7 e simili , puoi fare:

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

MA, (start) funzionerà SOLO, se si specifica il flag "--all":

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

Altrimenti, non troverà i servizi, poiché non esistono. Questa è la funzionalità prevista dal sistema.

Per i sistemi basati su Ubuntu , funziona praticamente allo stesso modo, ma la differenza è che il flag "--all" deve essere specificato per tutti gli argomenti di systemctl, altrimenti non farà nulla.

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

2

Non so se esiste un'opzione per un carattere jolly sul terminale per systemd. Quello che puoi fare è aggiungerne uno sui tuoi script di systemd.

Il% vorrei fare il trucco, penso, ma è correlato al modo in cui hai scritto i servizi istanziati.

È possibile trovare una spiegazione qui indicata come specificatore

che mostra che:

% n

nome completo dell'unità

% p

Per le unità istanziate, si riferisce alla stringa prima del carattere "@" del nome dell'unità. Per le unità non istanziate, si riferisce al nome dell'unità con il suffisso del tipo rimosso.

%io

Per le unità istanziate: questa è la stringa tra il carattere "@" e il suffisso del nome dell'unità. Nome dell'unità

Non sto rispondendo direttamente alla tua domanda, ma per quello che immagino tu stia cercando di ottenere. Se ritieni che la tua soluzione possa essere trovata seguendo questa idea, ti preghiamo di condividere il tuo script systemd, in modo che possiamo eventualmente illustrare con esempi e forse anche fornirti lo script finale.

Se ti senti sicuro nel modificare il tuo script per raggiungere una soluzione in questo modo, qui hai un esempio (non lo citerò perché non so se sia pertinente per la soluzione ed è troppo specifico per quello che m proponendo)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.