Systemd Unit service restart se outro serviço for iniciado ou recarregado

13

Gostaria de saber se existe uma maneira com Systemd para reiniciar A.service ( After ) quando B.service é iniciado ou recarregado (somente recarregar config), se possível sem editar B.service , que é instalado e atualizado pelo sistema.

A.service deve começar mesmo se B.service não estiver instalado, desativado ou parado.

A.service :

[Unit]
After = B.service network-online.target
Wants = B.service

[Service]
Type=oneshot
ExecStart = /script.sh start
ExecStop = /script.sh stop
RemainAfterExit=yes

[Install]
WantedBy = network-online.target

B.service :

[Unit]
After=syslog.target network.target

[Service]
Type=forking
ExecStart=/cmd start
ExecStop=/cmd stop
ExecReload=/cmd reload
PIDFile=/var/run/cmd.pid

[Install]
WantedBy=multi-user.target
    
por Alex 26.11.2016 / 14:40

3 respostas

10

Você pode usar PartOf na seção [Unit] .

Exemplo: PartOf=B.service

Da página man,

PartOf=

Configures dependencies similar to Requires=, but limited to stopping and restarting of units. When systemd stops or restarts the units listed here, the action is propagated to this unit. Note that this is a one-way dependency — changes to this unit do not affect the listed units.

    
por 30.11.2016 / 10:15
1

No momento, o systemd não cobre esse senario. Você não pode obter essa funcionalidade apenas por meio de arquivos de serviço. Uma possibilidade é sequestrar o systemctl através de um shell script com o mesmo nome e, nessa verificação, verificar se o B.service está prestes a ser re / iniciado ou recarregado, fazer a ação apropriada com o A.service também e, se necessário, atualizar o rc.local para chegar ao estado adequado na inicialização também. Eu tenho esse problema com docker.service e networking.service, mas eu sempre os reinicio juntos:

systemctl restart docker.service networking.service

Obviamente, isso não seria efetivo se o próprio systemd manipulasse o B.service internamente (por exemplo, através de outros arquivos de serviço.).

    
por 03.12.2016 / 11:27
1

Eu não tinha controle sobre stop com PartOf= e A não deve parar com B , então acabei usando Substituindo configurações de fornecedor , parece funcionar.

/etc/systemd/system/B.service.d/override.conf

[Service]
ExecStart=
ExecStart=/bin/sh -c '/cmd start || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
ExecReload=
ExecReload=/bin/sh -c '/cmd reload || exit $?; sleep 5; [ -x /script.sh ] && /script.sh start; exit 0'
A implementação de

/cmd é assíncrona e acessa um recurso que /script.sh precisa acessar também, não achei nada melhor (por enquanto) para dormir alguns segundos.

Eu tentei usar systemctl [--no-block] try-restart antes de usar /script.sh diretamente, mas não funcionou.

    
por 04.12.2016 / 21:32

Tags