systemd: definindo dependências entre unidades de timer modeladas?

systemd: definindo dependências entre unidades de timer modeladas?

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=dailye 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 flockcomando 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 OnCalendarconfiguração são iniciados em paralelo, não; Atualizarei esta resposta assim que descobrir isso.

Responder2

Resolvi um problema semelhante colocando um Requirestrabalho backupno cleantrabalho. Meu cronômetro executa o cleantrabalho a cada 6 horas - e devido à dependência, o cleantrabalho é iniciado backupe, 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.

informação relacionada