como fazer um serviço systemd atômico; bloqueio manual / arquivo pid ou recurso systemd existe?

0

Eu tenho mybackups.service e mybackups.timer . Eu gostaria que mybackups.service tivesse apenas uma instância em execução. Isto é, eu quero que o seguinte aconteça:

Caso 1: o cronômetro já foi desativado mybackups.service

Se eu executar backups manualmente por algum motivo, $ systemctl start mybackups.service eu quero que o systemctl diga "pulando, já em execução"

Caso 2: iniciei manualmente mybackups.service

Quando mybackups.timer tenta iniciar seu serviço, na programação, eu gostaria que ele fosse interrompido por systemd com algum erro registrado, por exemplo: mybackups.service was already in progress

Caso 3: serviço de longa duração

Obviamente, eu provavelmente consertaria essa derrota, mas se por alguma razão um mybackups.service estivesse correndo muito tempo, eu esperaria que o próximo pontapé de saída por mybackups.timer receberia o mesmo tratamento do caso # 2 (ou seja: espero que não comece * outra execução de serviço)

tl; dr eu poderia (e Eu tenho ) altero o programa subjacente que mybackups.service começa a apenas sair quando ele encontra um arquivo PID antigo e um PID vivo em algum lugar. No entanto, este problema tão geral que estou esperando [2] & esperando que o systemd tenha opções para isso.

[2]: por exemplo: systemd já rastreia toda a árvore PID de seus serviços, parece o candidato perfeito para fazer isso corretamente para você.

    
por hippopots 11.07.2017 / 22:22

1 resposta

0

Esse já é o comportamento padrão. Há sempre no máximo uma instância da mesma unidade, e o systemd silenciosamente se recusa a enfileirar um job de início para uma unidade que já está iniciando ou ativa.

(Na verdade, para alcançar o oposto você precisaria de unidades de template, por exemplo, [email protected] pode ser iniciado várias vezes com diferentes parâmetros. Entretanto, cada unidade ainda permanece única; inicie duas cópias de [email protected] .)

    
por 11.07.2017 / 22:33

Tags