In our embedded device we have a main app and several services. Both main app and services are managed by systemd.
The main app has a plugin system, its plugins may be enabled or disabled at runtime. Say we have
PluginB. Both these plugins require a service, let's call it
Now if we had just one plugin we would start
ServiceP during load and stop the service during unload. But as we have two plugins and their lifetimes can overlap, we need some dynamic dependencies or reference counter:
PluginA loaded --> start ServiceP PluginB loaded --> do nothing (already started by PluginA) PluginA unloaded --> do nothing (still required by PluginB) PluginB unloaded --> stop ServiceP
Is there a way how to do this with systemd?
I assume not, as systemd manages whole applications. So if we implement the reference counter ourselves, could we have something as this:
# 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 ...
I assume it would be quite easy to achieve this by adding/removing dependencies in unit files and reloading them. But when
App crashes it would not stop
ServiceP, so I need to perform a cleanup action in
ExecStopPost=. This means calling
systemctl daemon-reload from unit file, which does not seem right. Is there a better solution?