Systemd: reinicie todas las instancias de un servicio instanciado a la vez

17

Utilizo la característica agradable de systemd: Servicios instanciados.

¿Hay una manera simple de recargar todos los servicios instanciados con una sola llamada?

Ejemplo: no quiero ejecutar todo de esta manera:

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

Intenté esto, pero esto no funciona.

systemctl restart autossh@*

Relacionado: Iniciar N procesos con un archivo de servicio systemd

Actualizar

Primero, me fascinaron los servicios instanciados, pero luego me di cuenta de que ejecutar una herramienta de administración de configuración como Ansible tiene más sentido. Aprendí: Mantenga las herramientas simples. Muchas herramientas comienzan a implementar comprobaciones de condición (si ... más ...) y bucles. Por ejemplo, servidores web o configuración del servidor de correo. Pero esto debería resolverse en un nivel diferente (superior): la gestión de la configuración. Ver: https://github.com/guettli/programming-guidelines#dont-use-systemd-instantiated-units

guettli
fuente

Respuestas:

23

Systemd (a partir de systemd-209) admite comodines, sin embargo, es probable que su shell intente expandirlos. Use comillas para pasar comodines al comando systemctl / service textualmente:

systemctl restart 'autossh@*'
Weirdan
fuente
No funciona para mí: systemctl status 'autossh@*'salida: autossh@\x2a.service - ... Active: inactive (dead)Versión:systemd 195
guettli
2
Globbing está disponible a partir de systemd 209: lists.freedesktop.org/archives/systemd-devel/2014-February/…
weirdan
Si tiene muchos servicios para reiniciar, el ciclo while en la respuesta de guettli funcionará mejor, ya que el comodín parece intentar reiniciarlos todos a la vez. Probado con ~ 1000 servicios php-fpm, la carga subió a 400 y tuve que reiniciar el servidor.
boutch55555
1
Funciona si los procesos ya se están ejecutando, pero no si tienen que iniciarse por primera vez después de que se hayan habilitado. Pero puede usar systemctl restart autossh@{1..2}(con cualquier N en lugar de 2) que es un poco menos general, pero también iniciará los procesos si lo son inactive (dead).
giorgiosironi
7

No es agradable, pero esto funciona para sistemas con un viejo systemd:

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

Por supuesto, la solución de la respuesta anterior ( systemctl restart 'autossh@*') es mejor.

guettli
fuente
Cuidado: cutpuede analizar el campo incorrecto en caso de que haya servicios fallidos en la salida de unidades de lista.
Juuso Ohtonen
5

@weirdan La respuesta es correcta, pero falta algo para ciertas distribuciones.

Para Centos 7 y similares , puede hacer:

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

PERO, (inicio) funcionará SOLO, si especifica la marca "--todos":

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

De lo contrario, no encontrará los servicios, ya que no existen. Esta es la característica prevista del sistema.

Para los sistemas basados ​​en Ubuntu , funciona más o menos de la misma manera, pero la diferencia es que el indicador "--todos" debe especificarse para todos los argumentos de systemctl, de lo contrario no hará nada.

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

No sé si hay una opción para un comodín en la terminal para systemd. Lo que puede hacer es agregar uno en sus scripts systemd.

El% que haría el truco, creo, pero está relacionado con la forma en que ha programado los servicios instanciados.

Puede encontrar una explicación aquí referida como especificadores

que muestra que:

%norte

nombre completo de la unidad

%pag

Para las unidades instanciadas, esto se refiere a la cadena antes del carácter "@" del nombre de la unidad. Para las unidades no instanciadas, esto se refiere al nombre de la unidad con el sufijo de tipo eliminado.

%yo

Para unidades instanciadas: esta es la cadena entre el carácter "@" y el sufijo del nombre de la unidad.

No estoy respondiendo directamente a tu pregunta, sino por lo que supongo que estás tratando de lograr. Si cree que su solución se puede encontrar siguiendo esta idea, comparta su secuencia de comandos systemd, para que eventualmente podamos ilustrar con ejemplos y tal vez incluso proporcionarle la secuencia de comandos final.

Si se siente seguro al editar su propio script para llegar a una solución de esa manera, aquí tiene un ejemplo (no lo citaré porque no sé si es relevante para la solución y es demasiado específico para lo que yo '' m proponiendo)

ignivs
fuente