在我们的嵌入式设备中,我们有一个主应用程序和几个服务。主要应用程序和服务均由 systemd 管理。
主应用程序有一个插件系统,其插件可以在运行时启用或禁用。假设我们有PluginA
和PluginB
。这两个插件都需要一个服务,我们称之为ServiceP
。
现在,如果我们只有一个插件,我们将ServiceP
在加载期间启动并在卸载期间停止服务。但是由于我们有两个插件并且它们的生命周期可以重叠,因此我们需要一些动态依赖项或引用计数器:
PluginA loaded --> start ServiceP
PluginB loaded --> do nothing (already started by PluginA)
PluginA unloaded --> do nothing (still required by PluginB)
PluginB unloaded --> stop ServiceP
有没有办法用 systemd 来做到这一点?
我认为不会,因为 systemd 管理整个应用程序。因此,如果我们自己实现引用计数器,我们可以得到这样的东西:
# 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
...
我认为通过添加/删除单元文件中的依赖项并重新加载它们可以很容易地实现这一点。但是当App
崩溃时它不会停止ServiceP
,所以我需要在 中执行清理操作ExecStopPost=
。这意味着systemctl daemon-reload
从单元文件调用,这似乎不对。有更好的解决方案吗?