¿Han generado SystemD procesos de N?

13

En mi organización, tenemos varios procesos de trabajo que consumen colas. Actualmente estamos usando SupervisorD para administrarlos, pero nos gustaría usar SystemD si es posible para obtener ciertas ventajas. Tengo bastante experiencia escribiendo unidades personalizadas, pero no tengo inmediatamente un análogo en tierra de SystemD para esto.

En la documentación de SupervisorDnumprocs se detalla un parámetro llamado que permite establecer el número de procesos que les gustaría iniciar con el servicio. Si quiero que se inicien 30 procesos, es un cambio de una línea.

¿Existe una configuración en las unidades SystemD que me permita especificar cuántos de estos procesos me gustaría iniciar?

Naftuli Kay
fuente
1
¿Estás intentando crear varias instancias de la misma unidad? Si es así, es posible que desee ver 0pointer.de/blog/projects/instances.html
Munir

Respuestas:

31

Lo que Munir mencionó es exactamente cómo haces esto. Básicamente, crea un servicearchivo y lo inicia 30 veces. Ahora, eso puede parecer un poco extraño, pero tiene ventajas, como poder cerrar uno de ellos si se comporta mal y no tener que cerrarlos a todos. También hay algunas cosas que puede hacer para facilitar la administración.

Primero, el archivo de la unidad. Cree un archivo, como /etc/systemd/system/[email protected]. Lo importante es el @símbolo.

Su contenido podría verse así:

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=multi-user.target

A continuación, iniciar con systemctl start [email protected], systemctl start [email protected].
Los procesos que se inician se verán así:

root     17222  19   0  0.0  0.0 Ss         00:05 /bin/sleep 600 1
root     17233  19   0  0.0  0.0 Ss         00:02 /bin/sleep 600 2

Tenga en cuenta que %Ise sustituyó con lo que haya puesto después de @cuando lo comenzó.

Puedes comenzar los 30 con un poco de shell-fu:

systemctl start test@{1..30}.service

También puede permitirles en el arranque como cualquier servicio normal: systemctl enable [email protected].

 

Ahora, lo que quise decir con cosas que puedes hacer para facilitar la administración: tal vez no quieras tener que usar test@{1..30}.servicepara administrarlas todas. Es un poco difícil de manejar. En su lugar, puede crear un nuevo objetivo para su servicio.

Crea /etc/systemd/system/test.targetcon:

[Install]
WantedBy=multi-user.target

Luego ajuste el /etc/systemd/system/[email protected]para que se vea así:

[Unit]
StopWhenUnneeded=true

[Service]
ExecStart=/bin/sleep 600 %I

[Install]
WantedBy=test.target

Vuelva a cargar systemd con systemctl daemon-reload(solo es necesario si está modificando el archivo de la unidad y no omitió la versión anterior). Y ahora habilite todos los servicios que desea que se administren haciendo systemctl enable test@{1..30}.service.
(Si anteriormente había habilitado el servicio mientras lo tenía WantedBy=multi-user.target, deshabilítelo primero para eliminar la dependencia)

Ahora puede hacer systemctl start test.targety systemctl stop test.target, e iniciará / detendrá los 30 procesos.
Y de nuevo, puede activar en el arranque como cualquier otro archivo unidad: systemctl enable test.target.

Patricio
fuente
Gracias por esta respuesta detallada, busqué esto durante varios días.
arnolem
1
¿Sabes si eso reiniciará los procesos que fallan?
bastian
@bastian: puedes usar Restart=on-failure. Lea la systemd.servicepágina del manual para más.
siride
1

Aquí está mi ejemplo usando un script de Python que se ejecuta en un virtualenv:

/etc/systemd/system/[email protected]

[Unit]
Description=manages my worker service, instance %i
After=multi-user.target

[Service]
PermissionsStartOnly=true
Type=idle
User=root
ExecStart=/usr/local/virtualenvs/bin/python /path/to/my/script.py
Restart=always
TimeoutStartSec=10
RestartSec=10

Inhabilitar: sudo systemctl enable my-worker\@{1..30}.service

Habilitar N trabajadores: sudo systemctl enable my-worker\@{1..2}.service

Recargar: sudo systemctl daemon-reload

Comienzo: sudo systemctl start [email protected]

Comprobar estado: sudo systemctl status my-worker@1

radtek
fuente