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:

Restarty envolvermy_cmdasí:ExecStart=/bin/sh -c 'while ! my_cmd; do sleep 1; done'junto con unTimeoutStartSecvalor 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.FailureActiontoma los mismos valores queStartLimitAction, y todos exceptononedesencadenar un cierre de algún tipo.Respuestas:
Una posible solución que estoy intentando es
Donde la secuencia de comandos
tag.shserátouch /ack/TAG_SUCCESSal final de la ejecución. Creo que esto se acerca bastante al comportamiento deseado porqueExecStartPrese ejecutará secuencialmente, esperando la finalización exitosa antes de llamarExecStarty la unidad solo se consideraStartinguna vez queExecStartse 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=yespara que la unidad permanezca "activa" para que otras unidades puedan depender de ella.