He leído la página de manual del servicio systemd varias veces, pero aún no puedo entender un patrón básico de systemd:
Quiero ejecutar un proceso de inicio una vez (como un contenedor acoplable o formatear una unidad) en el arranque, con éxito hasta su finalización. Pero si uso Type = oneshot para eso, entonces no puedo usar Restart = on-failure, y si falla, no volverá a intentar el trabajo. ¿Me estoy perdiendo algo obvio aquí?
También intenté configurar Type = simple con Restart = on-failure, pero en muchos casos necesito el siguiente comportamiento (de la página de manual) que ofrecen los servicios de onehot:
El comportamiento de oneshot es similar a simple; sin embargo, se espera que el proceso tenga que salir antes de que systemd comience las unidades de seguimiento.
Actualizaciones:
Restart
y envolvermy_cmd
así:ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'
junto con unTimeoutStartSec
valor razonable .Restart=
estableciendoFailureAction=[self.unit]
(reemplace [self.unit] con el nombre de la unidad). Es algo hacky, pero al menos explícito y fácil de seguir.FailureAction
toma los mismos valores queStartLimitAction
, y todos exceptonone
desencadenar un cierre de algún tipo.Respuestas:
Una posible solución que estoy intentando es
Donde la secuencia de comandos
tag.sh
serátouch /ack/TAG_SUCCESS
al final de la ejecución. Creo que esto se acerca bastante al comportamiento deseado porqueExecStartPre
se ejecutará secuencialmente, esperando la finalización exitosa antes de llamarExecStart
y la unidad solo se consideraStarting
una vez queExecStart
se llama, momento en el que estamos seguros de que hemos completado la tarea de inicio.¿Pero esto todavía se siente como un truco gigante?
fuente
RemainAfterExit=yes
para que la unidad permanezca "activa" para que otras unidades puedan depender de ella.