相关疑难解决方法(0)

在无头系统上启动共享会话 D-Bus 的 systemd 服务

我需要帮助在无头 Linux 系统上启动通过会话(不是系统)D-Bus 进行通信的服务。关键是没有人会登录无头系统。

到目前为止,我已经能够在三个不同的终端中代表未登录的用户(“其他用户”)启动 D-Bus 守护程序并测试 D-Bus 通信:

在第一个终端中,我为“otheruser”启动了一个 D-Bus 守护进程:

$ sudo -u otheruser dbus-daemon --session --print-address 1
unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48
Run Code Online (Sandbox Code Playgroud)

在第二个终端中,我使用上述 DBUS_SESSION_BUS_ADDRESS 响应启动 D-Bus 服务器应用程序:

$ sudo -u otheruser DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48" /usr/bin/my-dbus-service
Run Code Online (Sandbox Code Playgroud)

然后,在第三个终端中,我可以测试连接:

$ sudo -u otheruser DBUS_SESSION_BUS_ADDRESS="unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48" gdbus introspect --session --dest com.mycompany.myappname --object-path /com/mycompany/interface
Run Code Online (Sandbox Code Playgroud)

但是,我想通过 systemd 启动 D-Bus 服务器应用程序以及一些客户端 D-Bus 服务。如何通过 systemd 启动 D-Bus 会话,以便将其 DBUS_SESSION_BUS_ADDRESS 环境变量传播到“otheruser”的 D-Bus 服务器和客户端服务?

一种可能的解决方案可能是将 dbus-daemon 的输出通过管道传输到“somefile”,然后在启动 D-Bus 服务器和客户端之前设置 DBUS_SESSION_BUS_ADDRESS=$(cat somefile)。这对我来说似乎有点太尴尬了;特别是因为我知道系统D-Bus 连接的 systemd 服务文件中的“Busname”指令有一些神奇之处。如何为“其他用户”正确启动 systemd 服务,以便这些 systemd 服务可以与会话 D-Bus 接口进行通信?

linux headless dbus systemd

14
推荐指数
1
解决办法
2万
查看次数

标签 统计

dbus ×1

headless ×1

linux ×1

systemd ×1