
Estoy usando algunas unidades de temporizador con plantilla para ejecutar conjuntos de servicios con plantilla. Hay trabajos de respaldo y tareas de mantenimiento asociadas que requieren un bloqueo exclusivo en el repositorio de respaldo y no pueden ejecutarse al mismo tiempo que los trabajos de respaldo. Estoy tratando de descubrir cómo configurar las unidades para que los trabajos se secuencian correctamente.
Por ejemplo, tengo las siguientes plantillas de servicio:
Tengo las siguientes plantillas de temporizador:
Donde la [email protected]
unidad inicia la [email protected]
instancia correspondiente y podría verse así:
[Unit]
Description=daily backup of %i
[Timer]
OnCalendar=daily
Unit=backup@%i.service
[Install]
WantedBy=timers.target
Si corro...
systemctl enable --now [email protected] [email protected]
...Necesito asegurarme de que el servicio clean@foo no se ejecute hasta que se haya completado el servicio backup@foo.
La única solución que se me ocurrió hasta ahora es eliminar OnCalendar=daily
y en su lugar usar horas de inicio explícitas para poder garantizar las tareas de respaldo.comenzarprimero (por ejemplo, iniciar los trabajos de respaldo a la 1 a. m. y los trabajos de mantenimiento a las 2 a. m.) y luego utilizar algún tipo de flock
comando de bloqueo (por ejemplo, el) para garantizar que los trabajos de mantenimiento no comiencen hasta que se hayan completado los trabajos de respaldo.
Eso funciona, pero es un poco complicado. Si hay una manera mejor de resolver esto usando systemd, me gustaría descubrirlo.
Respuesta1
Después de pensar un poco en esa pregunta, hay una respuesta obvia: en la [email protected]
plantilla, agregue una dependencia en la [email protected]
instancia correspondiente, como esta:
[Unit]
After=backup@%i.service
Esto funciona bien siempre que los servicios se inicien en paralelo. No sé en este momento si los servicios con la misma OnCalendar
configuración se inician en paralelo o no; Actualizaré esta respuesta una vez que lo haya descubierto.
Respuesta2
Resolví un problema similar poniendo Requires
a backup
trabajar en el clean
trabajo. Mi temporizador ejecuta el clean
trabajo cada 6 horas y, debido a la dependencia, el clean
trabajo se inicia backup
y, cuando finaliza la copia de seguridad, limpia cualquier instantánea que tenga más de 60 días. Por cierto, ambos servicios lo son Type=oneshot
.
También consideré tener un único trabajo de copia de seguridad y limpieza, que también habría funcionado de manera similar.
La desventaja es que no puedo ejecutar un trabajo limpio sin iniciar una copia de seguridad, aunque esto no es un problema real.