A unidade de timer do systemd pula a próxima execução se o processo ainda não foi concluído?

18

Eu quero usar o systemd para executar um comando a cada 5 minutos. No entanto, existe o risco de que ocasionalmente a tarefa leve mais de 5 minutos para ser executada. Nesse ponto, o systemd iniciará uma segunda instância do comando, ou seja, terminarei com 2 processos em execução?

É possível dizer ao systemd para não iniciar um segundo processo se o primeiro não tiver sido concluído? Caso contrário, quais são algumas boas soluções?

Nota: Espero que a resposta seja "Esse é o comportamento padrão. Ele simplesmente não está documentado". Se for essa a situação, alguém pode me dizer como registrar um bug nos documentos?

Nota: O Cron tem um problema semelhante, que é discutido em /unix//a/173928/11244 . Estou procurando o equivalente systemd.

TomOnTime
fonte

Respostas:

27

Esse é o comportamento padrão (e o único). Não está explicitamente documentado, mas está implícito na lógica de operação do systemd.

systemd.timer (5) lê:

Para cada arquivo de timer, um arquivo de unidade correspondente deve existir, descrevendo a unidade a ser ativada quando o timer terminar .

systemd (1) , por sua vez, descreve o conceito de estados de unidade e transições entre eles:

As unidades podem estar "ativas" (significando iniciadas, vinculadas, conectadas, ..., dependendo do tipo de unidade, veja abaixo) ou "inativas" (significando interrompidas, não ligadas, desconectadas, ...), bem como em o processo de ativação ou desativação , ou seja, entre os dois estados (esses estados são chamados de "ativando", "desativando").

Isso significa que o acionamento de um timer leva à "ativação" da unidade correspondente, ou seja, sua transição para o estado "ativo".

Se a unidade correspondente já estiver "ativa" no momento da "ativação" (para uma unidade de serviço, isso significa "o processo principal ainda está em execução", a menos que a unidade de serviço tenha Type=oneshote RemainAfterExit=true), deve ser óbvio que nenhuma ação será tomada. ocupado.

intelfx
fonte
Você poderia esclarecer os serviços "oneshot"? Na minha opinião, um serviço "oneshot" não deve executar outra cópia em nenhuma circunstância (página de manual: o processo precisa sair antes que o systemd inicie as unidades de acompanhamento)
Gima
11
@Gima Uma unidade oneshot sem nenhum parâmetro extra é considerada "ativada" enquanto o processo inicial está em execução e fica "inativa" quando sai. Neste momento, outro gatilho pode ativar essa unidade novamente.
Intelfx
11
@Gima ... no entanto, uma unidade oneshot que RemainAfterExit=truepermanecerá "ativa" quando o processo inicial terminar, portanto, os disparos subsequentes de um temporizador serão ignorados, a menos que um administrador desative explicitamente (pare) essa unidade ou seja derrubado por um negativo. dependências.
Intelfx
11
Eu continuo recebendo representantes como as pessoas convidam isso. Espero que o systemd não esclareça seus documentos.
TomOnTime
11
Agora isso faz parte dos documentos do 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