Agrupando serviços para que a falha em um reinicie todos eles

1

Eu tenho um grupo de serviços que estão fundamentalmente vinculados (idealmente eles devem ser executados como um único serviço / processo, mas esse trabalho ainda precisa ser feito) em que eu quero a falha de um serviço para fazer com que os outros serviços sejam reiniciado também.

Estou usando uma unidade de destino para iniciá-los todos ao mesmo tempo e configuro todos eles como Restart=always para recuperar individualmente, mas isso não reiniciaria os outros serviços se um serviço falhasse por algum motivo.

Eu achei que poderia usar a diretiva BindsTo , que parece interromper todos os serviços se um deles falhar (como o processo ser eliminado).

Meus arquivos de serviço atualmente são assim:

[Unit]
Description=foo
After=syslog.target network.target
BindsTo=foo.service bar.service baz.service all-services.target

[Service]
User=foo
WorkingDirectory=~
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
SyslogIdentifier=foo
ExecStart=/path/to/binary 
[Install]
WantedBy=all-services.target

Com um alvo de agrupamento definido como:

[Unit]
Description=all-services
BindsTo=foo.service bar.service baz.service

Mas a diretiva BindsTo parece parar completamente todos os serviços quando um falha e nunca tenta reiniciar.

Não consigo encontrar nada que sugira que essa propriedade de reinício do grupo de serviços seja alcançável diretamente no systemd, em vez de reiniciar uma cadeia de dependências, mas talvez esteja faltando alguma coisa (ou ignorar uma maneira melhor de fazer isso).

    
por ydaetskcoR 24.08.2017 / 11:37

1 resposta

1

Usando a diretiva PartOf junto com a unidade de destino para começar todos os serviços como um grupo parece alcançar meus objetivos.

Meus arquivos de serviço agora são assim:

[Unit]
Description=foo
After=syslog.target network.target
PartOf=foo.service bar.service baz.service all-services.target

[Service]
User=foo
WorkingDirectory=~
Restart=always
RestartSec=90
StartLimitInterval=400
StartLimitBurst=3
SyslogIdentifier=foo
ExecStart=/path/to/binary 
[Install]
WantedBy=all-services.target

e o alvo de agrupamento parece:

[Unit]
Description=all-services
PartOf=foo.service bar.service baz.service

Eu posso iniciar e reiniciar foo , bar e baz services executando systemctl start all-services.target e eliminando o processo usado por foo , fazendo com que todos sejam interrompidos e reiniciados.

Uma coisa que não está clara é que se eu executar systemctl stop all-services.target , todos os serviços serão interrompidos, mas um systemctl start all-services.target do estado parado só inicia a unidade de destino em vez de todos os serviços.

Eu tentei trocar WantedBy para RequiredBy nas unidades de serviço, mas isso não parece mudar nada.

    
por 24.08.2017 / 11:57

Tags