Gostaria de saber se existe uma maneira Systemd
de reiniciar A.service
( After
) quando B.service
iniciar ou recarregar (apenas recarregar a configuração), se possível sem editar a B.service
instalação e a atualização do sistema.
A.service
deve iniciar 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
Overriding vendor settings
mas isso parece ainda mais fácil e promissor, apenas a exceção é que eu não queroA
parar seB
parar, apenasA.restart
seB.start
, de qualquer maneira, eu fizer algum teste em breve e ver se há alguma maneira de gerenciá-lo, então vai deixar você saberPartOf
eRestart=always
juntos?Restart=
a documentação, eu não tenho certeza qual é o comportamento comoneshot
serviços, mas independentemente disso:When the death of the process is a result of systemd operation (e.g. service stop or restart), the service will not be restarted
se eu entendi corretamente parar manualmente B pararia APartOf
não é uma solução para a pergunta, aproveite de qualquer maneira.PartOf
comRestart=always
? Você tentou isso?Eu não tinha controle sobre
stop
comPartOf=
, eA
não deve parar comB
, então acabei usando configurações de fornecedores Substituindo , parece funcionar./etc/systemd/system/B.service.d/override.conf
/cmd
a implementação é assíncrona e acessa um recurso que também/script.sh
precisa ser acessado; não encontrei 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.fonte
man systemd.unit
(ou pesquise on-line se não estiver instalado) e procure o capítulo "Substituindo configurações do fornecedor".No momento, o systemd não cobre esse senario. Você não pode conseguir essa funcionalidade apenas com arquivos de serviço. Uma possibilidade é seqüestrar systemctl por meio de um script de shell com o mesmo nome e, nessa verificação, para verificar se o B.service está prestes a ser reiniciado ou recarregado, execute a ação apropriada com o A.service e, se necessário, atualize o rc.local para obter o estado adequado na inicialização também. Eu tenho esse problema com o docker.service e o networking.service, mas eu sempre os reinicio sempre:
Obviamente, isso não seria eficaz se o próprio systemd manipulasse B.service internamente (por exemplo, por meio de outros arquivos de serviço).
fonte