【问题标题】:How to define a d-bus activated systemd service?如何定义一个 d-bus 激活的 systemd 服务?
【发布时间】:2015-10-20 13:16:19
【问题描述】:

有没有人有一个例子,或者一个如何定义一个由 d-bus 激活的 systemd .service 的例子的链接?

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

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

内容如下:

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

现在可以通过对 systemd.Manager 的 d-bus 调用来启动/停止服务吗?如果有,怎么做?

【问题讨论】:

    标签: dbus systemd


    【解决方案1】:

    让我们看一下 systemd 附带的一项服务,即主机名。

    # 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 我有同样的问题,但在我的情况下,dbus 激活应该发生在会话总线而不是系统上,你能提供任何指导吗?
    【解决方案2】:

    扩展 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] 部分中的行

    【讨论】:

    • 至少在 ArchLinux(systemd 版本242.32)上,情况似乎不再如此。在systemd-hostnamed.service 中没有[Install] 部分,而是由systemd 包直接安装dbus-org.freedesktop.hostname1.service
    • 是的,根据这个page,您不需要[Install] 部分。见例 6
    猜你喜欢
    • 2016-12-02
    • 2019-01-19
    • 2021-09-05
    • 2019-03-10
    • 2012-11-30
    • 2021-04-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多