如何定义 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]
部分
中的符号链接和行
有没有人有关于如何定义由 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]
部分