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?
systemd
supervisord
Naftuli Kay
fuente
fuente
Respuestas:
Lo que Munir mencionó es exactamente cómo haces esto. Básicamente, crea un
service
archivo 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í:
A continuación, iniciar con
systemctl start [email protected]
,systemctl start [email protected]
.Los procesos que se inician se verán así:
Tenga en cuenta que
%I
se sustituyó con lo que haya puesto después de@
cuando lo comenzó.Puedes comenzar los 30 con un poco de shell-fu:
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}.service
para 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.target
con:Luego ajuste el
/etc/systemd/system/[email protected]
para que se vea así: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 haciendosystemctl 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.target
ysystemctl 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
.fuente
Restart=on-failure
. Lea lasystemd.service
página del manual para más.Aquí está mi ejemplo usando un script de Python que se ejecuta en un virtualenv:
/etc/systemd/system/[email protected]
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
fuente