org.freedesktop.systemd1下的systemd dbus服务是否能够管理单元模板?

org.freedesktop.systemd1下的systemd dbus服务是否能够管理单元模板?

我正在编写一个程序,它管理一些单元模板的大量实例。我的计划是使用 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'

相关内容