¿La unidad de temporizador systemd omite la próxima ejecución si el proceso aún no ha terminado?

18

Quiero usar systemd para ejecutar un comando cada 5 minutos. Sin embargo, existe el riesgo de que ocasionalmente la tarea tarde más de 5 minutos en ejecutarse. En ese punto, ¿systemd iniciará una segunda instancia del comando, es decir, terminaré con 2 procesos en ejecución?

¿Es posible decirle a systemd que no inicie un segundo proceso si el primero no se ha completado? Si no, ¿cuáles son algunas buenas soluciones?

Nota: Espero que la respuesta sea "Ese es el comportamiento predeterminado. Simplemente no está documentado". Si esta es la situación, ¿alguien puede decirme cómo presentar un error en sus documentos?

Nota: Cron tiene un problema similar que se trata en /unix//a/173928/11244 . Estoy buscando el equivalente de systemd.

TomOnTime
fuente

Respuestas:

27

Este es el comportamiento predeterminado (y el único). No está documentado explícitamente, pero está implícito en la lógica de operación de systemd.

systemd.timer (5) lee:

Para cada archivo de temporizador, debe existir un archivo de unidad coincidente, que describa la unidad que se activará cuando transcurra el temporizador .

systemd (1) , a su vez, describe el concepto de estados unitarios y las transiciones entre ellos:

Las unidades pueden estar "activas" (es decir, iniciadas, enlazadas, conectadas, ..., según el tipo de unidad, ver más abajo), o "inactivas" (es decir, detenidas, no vinculadas, desconectadas, ...), así como en El proceso de activación o desactivación , es decir, entre los dos estados (estos estados se denominan "activación", "desactivación").

Esto significa que la activación de un temporizador conduce a la "activación" de la unidad correspondiente, es decir, su transición al estado "activo".

Si la unidad de adaptación ya está "activa" en el momento de "activación" (para una unidad de servicio, esto significa "el proceso principal todavía se está ejecutando", a menos que la unidad de servicio tiene Type=oneshoty RemainAfterExit=true), debería ser obvio que ninguna acción será tomado.

intelfx
fuente
¿Podría aclarar los servicios de "un disparo"? En mi opinión, un servicio "mono" no debería ejecutar otra copia bajo ninguna circunstancia (página de manual: el proceso debe salir antes de que systemd inicie las unidades de seguimiento)
Gima
1
@Gima una unidad de un solo disparo sin ningún parámetro adicional se considera "activada" mientras se ejecuta su proceso inicial y se vuelve "inactiva" cuando sale. En este momento, otro disparador puede activar esa unidad nuevamente.
intelfx
1
@Gima ... sin embargo, una unidad de un solo disparo que RemainAfterExit=truepermanecerá "activa" cuando finalice su proceso inicial, por lo que los activadores posteriores de un temporizador se ignorarán a menos que un administrador desactive (pare) explícitamente esa unidad, o sea derribada por un negativo dependencias
intelfx
1
Sigo recibiendo representantes a medida que la gente invita a esto. Espero que systemd no aclare sus documentos.
TomOnTime
1
Esto ahora es parte de los documentos de systemd: Note that in case the unit to activate is already active at the time the timer elapses it is not restarted, but simply left running. There is no concept of spawning new service instances in this case. freedesktop.org/software/systemd/man/systemd.timer.html
Sam