如何定义 d-bus 激活的 systemd 服务?

How to define a d-bus activated systemd service?

有没有人有关于如何定义由 d-bus 激活的 systemd .service 的示例或 link 示例?

我的理解是,如果我在这里创建一个 test.service 文件:

/usr/share/dbus-1/services/test.service

内容如下:

[D-BUS Service]
Name=org.me.test
Exec="/tmp/testamundo.sh"

现在可以通过 d-bus 调用 systemd.Manager 来 started/stopped 服务吗?如果可以,怎么做?

让我们看一下 systemd 附带的一项服务,hostnamed。

# cat /usr/share/dbus-1/system-services/org.freedesktop.hostname1.service

#  This file is part of systemd.
#
#  systemd is free software; you can redistribute it and/or modify it
#  under the terms of the GNU Lesser General Public License as published by
#  the Free Software Foundation; either version 2.1 of the License, or
#  (at your option) any later version.

[D-BUS Service]
Name=org.freedesktop.hostname1
Exec=/bin/false
User=root
SystemdService=dbus-org.freedesktop.hostname1.service

神奇的是SystemdService=指令。 SystemdService= 指定的服务是 dbus-daemon 要求 systemd 激活的服务。

我们期待在 systemd 服务目录中有一个名为 dbus-org.freedesktop.hostname1.service 的服务。

# readlink /usr/lib/systemd/system/dbus-org.freedesktop.hostname1.service
systemd-hostnamed.service

好了,这样 dbus 服务 org.freedesktop.hostname1.service 告诉 systemd 激活 systemd 服务 systemd-hostnamed.service

systemd 服务看起来像

# cat /usr/lib/systemd/system/systemd-hostnamed.service
...
...
[Service]
BusName=org.freedesktop.hostname1
...
...

systemd 服务文件的神奇之处在于 BusName= 指令。该指令告诉 systemd 在继续之前等到给定的总线名称出现在总线上。

注意:dbus 服务的语法与 systemd 服务完全不同。您需要两者才能让 dbus 激活守护进程。

扩展 Umut 的回答:

systemd 的服务定义文件中还有:

# cat /usr/lib/systemd/system/systemd-hostnamed.service
...
...
[Install]
Alias=dbus-org.freedesktop.hostname1.service
...
...

这确保在启用服务时安装了 /usr/lib/systemd/system/dbus-org.freedesktop.hostname1.service 符号链接。

dbus 服务定义指向 dbus-org.freedesktop.hostname1.service 而不是 systemd-hostnamed.service 的原因纯粹是为了方便。这样很明显,主机名服务是 dbus 激活的。您可以直接指向实际服务并跳过 [Install] 部分

中的符号链接和行