No nosso dispositivo incorporado, temos um aplicativo principal e vários serviços. Tanto o aplicativo principal quanto os serviços são gerenciados pelo systemd.
O aplicativo principal tem um sistema de plugins, seus plugins podem ser ativados ou desativados em tempo de execução. Digamos que tenhamos PluginA
e PluginB
. Ambos os plugins requerem um serviço, vamos chamá-lo de ServiceP
.
Agora, se tivéssemos apenas um plug-in, iniciaríamos ServiceP
durante o carregamento e parássemos o serviço durante o descarregamento. Mas como temos dois plugins e suas vidas podem se sobrepor, precisamos de algumas dependências dinâmicas ou contador de referência:
PluginA loaded --> start ServiceP
PluginB loaded --> do nothing (already started by PluginA)
PluginA unloaded --> do nothing (still required by PluginB)
PluginB unloaded --> stop ServiceP
Existe uma maneira de fazer isso com o systemd?
Eu assumo não, pois o systemd gerencia aplicativos inteiros. Então, se nós mesmos implementarmos o contador de referência, poderíamos ter algo assim:
# case 1
App starts (don't start ServiceP, app didn't request it yet)
App says it needs ServiceP --> start ServiceP
App says it no longer needs ServiceP --> stop ServiceP
# case 2
App says it needs ServiceP --> start ServiceP
App stops/crashes --> stop ServiceP
...
Eu suponho que seria muito fácil conseguir isso adicionando / removendo dependências em arquivos unitários e recarregando-os. Mas quando o App
travar, ele não parará ServiceP
, portanto, preciso executar uma ação de limpeza em ExecStopPost=
. Isso significa chamar systemctl daemon-reload
do arquivo de unidade, o que não parece correto. Existe uma solução melhor?
Tags systemd