¿SystemD ha generado N procesos?

¿SystemD ha generado N procesos?

En mi organización, tenemos varios procesos de trabajo que consumen colas. Actualmente utilizamos 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 SystemD para esto.

En elDocumentación del supervisorSe detalla un parámetro llamado numprocsque permite establecer la cantidad de procesos que desea que se inicien 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?

Respuesta1

Lo que Munir mencionó es exactamente cómo se hace esto. Básicamente creas un servicearchivo y lo inicias 30 veces. Ahora bien, eso puede parecer un poco incómodo, pero tiene ventajas, como poder cerrar uno de ellos si se porta mal, y no tener que cerrarlos todos. También hay algunas cosas que puede hacer para facilitar la gestión.

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

Su contenido podría verse así:

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

[Install]
WantedBy=multi-user.target

Entonces empieza con , . Los procesos que se inician se verán así:systemctl start [email protected]systemctl start [email protected]

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

Observe que %Ise sustituyó con lo que puso después de @cuando lo inició.

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

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

También puedes habilitarlos 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 usarlas test@{1..30}.servicepara administrarlas todas. Es un poco difícil de manejar. En su lugar, puede crear un nuevo objetivo para su servicio.

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

[Install]
WantedBy=multi-user.target

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

[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 se saltó la versión anterior). Y ahora habilite todos los servicios que desee administrar haciendo systemctl enable test@{1..30}.service.
(Si previamente 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.targety se iniciarán/detendrán los 30 procesos.
Y nuevamente, puede habilitarlo en el arranque como cualquier otro archivo de unidad: systemctl enable test.target.

Respuesta2

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

/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

Desactivar:sudo systemctl disable my-worker\@{1..30}.service

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

Recargar:sudo systemctl daemon-reload

Comenzar:sudo systemctl start [email protected]

Comprobar estado:sudo systemctl status my-worker@1

información relacionada