systemd dependências dinâmicas (tempo de execução)

2

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?

    
por Adam Trhon 29.01.2016 / 15:47

0 respostas

Tags