systemd: dependência de serviço “Se A não está rodando, B não deve rodar”?

2

(versão 229 do systemd, fwiw)

Eu tenho um serviço primário A e um serviço secundário B. O primário A pode ser executado sozinho. Mas o serviço B não pode rodar corretamente sozinho: ele precisa que A esteja rodando (tecnicamente B pode rodar, mas isto é o que eu quero que o systemd previna). Meu objetivo: Se A não está rodando, B não deve rodar. Dado que A e B estão rodando, quando A pára ou morre / trava, então B deve ser parado.

Como faço para isso?

Eu chego perto adicionando itens [Unit] ao b.service, usando

Requisite=A.service
After=A.service

O resultado do acima é que

1) B won't start unless A is running (good).
2) B is stopped when A is stopped (good).
3) However, if I kill A, service B continues to run (bad).

Como posso consertar este último comportamento # 3? Eu tentei usar o BindsTo em vez do Requisite, como este no arquivo de serviço do B:

BindsTo=A.service
After=A.service

e eu recebo:

1) If A is not running and I start B, then A is also started
    (I want an error, I don't want A started)
2) B is stopped when A is stopped (good).
3) B is stopped when A is killed (good)

Então agora # 3 é bom, mas # 1 não é o comportamento desejado. Nem o PartOf nem o BindsTo parecem fazer o truque, mas talvez eu não tenha o encantamento certo de combinações de opções? Não está claro para mim nas páginas de manual quais opções podem ser combinadas.

Com o BindsTo, eu também tentei falhar na inicialização do B usando o ExecStartPre, mas é claro que isso não funcionou porque o início do B já havia determinado que precisava do A para rodar (e iniciar), antes de disparar B.

Existe alguma maneira de obter um comportamento entre o Requisite e o BindsTo? O 1-2-3 que listei acima?

Thanx antecipadamente!

    
por Uncle Spook 20.11.2017 / 02:51

0 respostas

Tags