systemd 动态(运行时)依赖项

systemd 动态(运行时)依赖项

在我们的嵌入式设备中,我们有一个主应用程序和几个服务。主要应用程序和服务均由 systemd 管理。

主应用程序有一个插件系统,其插件可以在运行时启用或禁用。假设我们有PluginAPluginB。这两个插件都需要一个服务,我们称之为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从单元文件调用,这似乎不对。有更好的解决方案吗?

相关内容