
Estou usando algumas unidades de timer modeladas para executar conjuntos de serviços modelados. Existem tarefas de backup e tarefas de manutenção associadas que exigem um bloqueio exclusivo no repositório de backup e não podem ser executadas ao mesmo tempo que as tarefas de backup. Estou tentando descobrir como configurar as unidades para que os trabalhos sejam sequenciados corretamente.
Por exemplo, tenho os seguintes modelos de serviço:
Eu tenho os seguintes modelos de temporizador:
Onde a [email protected]
unidade inicia a [email protected]
instância correspondente e pode ser algo como:
[Unit]
Description=daily backup of %i
[Timer]
OnCalendar=daily
Unit=backup@%i.service
[Install]
WantedBy=timers.target
Se eu correr...
systemctl enable --now [email protected] [email protected]
...Preciso garantir que o serviço clean@foo não seja executado até que o serviço backup@foo seja concluído.
A única solução que encontrei até agora é abandonar OnCalendar=daily
e usar horários de início explícitos para poder garantir os trabalhos de backupcomeçarprimeiro (por exemplo, iniciar as tarefas de backup à 1h e as tarefas de manutenção às 2h) e, em seguida, utilizar algum tipo de flock
comando de bloqueio (por exemplo, o ) para garantir que as tarefas de manutenção não sejam iniciadas até que as tarefas de backup sejam concluídas.
Isso funciona, mas é um pouco hackeado. Se houver uma maneira melhor de resolver isso usando o systemd, eu gostaria de descobrir isso.
Responder1
Depois de pensar um pouco nessa questão, há uma resposta óbvia: no [email protected]
modelo, adicione uma dependência na [email protected]
instância correspondente, assim:
[Unit]
After=backup@%i.service
Isso funciona bem desde que os serviços sejam iniciados em paralelo. Não sei agora se serviços com a mesma OnCalendar
configuração são iniciados em paralelo, não; Atualizarei esta resposta assim que descobrir isso.
Responder2
Resolvi um problema semelhante colocando um Requires
trabalho backup
no clean
trabalho. Meu cronômetro executa o clean
trabalho a cada 6 horas - e devido à dependência, o clean
trabalho é iniciado backup
e, quando o backup é concluído, ele limpa todos os instantâneos com mais de 60 dias. A propósito, ambos os serviços são Type=oneshot
.
Também considerei ter uma única tarefa de backup e limpeza, que também teria funcionado de maneira semelhante.
A desvantagem é que não consigo executar um trabalho limpo sem iniciar um backup, embora isso não seja um problema real.