![org.freedesktop.systemd1下的systemd dbus服务是否能够管理单元模板?](https://linux22.com/image/209046/org.freedesktop.systemd1%E4%B8%8B%E7%9A%84systemd%20dbus%E6%9C%8D%E5%8A%A1%E6%98%AF%E5%90%A6%E8%83%BD%E5%A4%9F%E7%AE%A1%E7%90%86%E5%8D%95%E5%85%83%E6%A8%A1%E6%9D%BF%EF%BC%9F.png)
我正在编写一个程序,它管理一些单元模板的大量实例。我的计划是使用 systemd 的 dbus 服务来做到这一点。但显然,org.freedesktop.systemd1.Manager 上的接口只能管理已经加载的单元,或者单元文件。
使用单元文件的方法不适用于启用或启动模板实例,因为它们显然不适用于没有名称完全匹配的单元文件的单元名称,并且找不到与匹配实例对应的模板。
对已加载单元起作用的方法还需要已加载具有该确切名称的单元,而单元则不然,因为单元尚未实例化。
此外,界面的文档并没有真正讨论模板。这个界面不是应该和systemctl
命令一样强大吗?
我只是错过了一些关于界面的东西吗?或者是否有另一个界面,专门用于模板,但我还没有找到?还是没有办法用 systemd 来做这些事情?
答案1
dbus 上的 systemd 服务也完全能够管理从模板单元文件启动的服务。因此,假设您有一个模板单元文件[email protected]
和一个具有具体名称的实例[email protected]
,则应该启动该单元。
dbus-send --system --print-reply --dest=org.freedesktop.systemd1 /org/freedesktop/systemd1 org.freedesktop.systemd1.Manager.StartUnit string:'[email protected]' string:'replace'
如果尚未通过方法完成,您也可以启用该单元org.freedesktop.systemd1.Manager.EnableUnitFiles
。
请注意,对于单元对象路径上的其他操作,您需要将名称转换为 dbus 有效名称,例如[email protected]
转换为
/org/freedesktop/systemd1/unit/foo_40bar_2eservice
where
@
翻译为_40
.
翻译为_2e
_
翻译为_5f
-
翻译为_2d
但不确定在哪里可以获得此翻译的完整列表。
例如,您可以与单位交互以获取属性
dbus-send --system --print-reply --dest=org.freedesktop.systemd1 /org/freedesktop/systemd1/unit/foo_40bar_2eservice org.freedesktop.DBus.Properties.Get string:'org.freedesktop.systemd1.Service' string:'MainPID'