我需要帮助在一个无界面的Linux系统上启动通过会话(而不是系统)D-Bus通信的服务。关键是没有人会登录到无界面系统上。
到目前为止,我已经能够代表一个未登录的用户("otheruser")在三个不同的终端中启动D-Bus守护进程并测试D-Bus通信:
在第一个终端中,我为"otheruser"启动一个D-Bus守护进程:
在第二个终端中,我使用上述DBUS_SESSION_BUS_ADDRESS响应启动D-Bus服务器应用程序。
然后,在第三个终端上,我可以测试连接:
但是,我想通过systemd启动D-Bus服务器应用程序以及一些客户端D-Bus服务。我该如何通过systemd启动D-Bus会话,以便将其DBUS_SESSION_BUS_ADDRESS环境变量传递给D-Bus服务器和客户端服务,供"otheruser"使用?
一个可能的解决方案是将dbus-daemon的输出导入到一个"somefile"中,然后在启动D-Bus服务器和客户端之前设置DBUS_SESSION_BUS_ADDRESS=$(cat somefile)。对我来说,这似乎有点笨拙;特别是因为我知道systemd服务文件中的"Busname"指令对于系统级D-Bus连接有一些魔法。我该如何正确地启动针对"otheruser"的systemd服务,以便这些systemd服务可以与会话D-Bus接口进行通信?
到目前为止,我已经能够代表一个未登录的用户("otheruser")在三个不同的终端中启动D-Bus守护进程并测试D-Bus通信:
在第一个终端中,我为"otheruser"启动一个D-Bus守护进程:
$ sudo -u otheruser dbus-daemon --session --print-address 1
unix:abstract=/tmp/dbus-a5cU7r4IHc,guid=6c0a9bbfd02f5f68da0fe32f5a5e0a48
在第二个终端中,我使用上述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
然后,在第三个终端上,我可以测试连接:
$ 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
但是,我想通过systemd启动D-Bus服务器应用程序以及一些客户端D-Bus服务。我该如何通过systemd启动D-Bus会话,以便将其DBUS_SESSION_BUS_ADDRESS环境变量传递给D-Bus服务器和客户端服务,供"otheruser"使用?
一个可能的解决方案是将dbus-daemon的输出导入到一个"somefile"中,然后在启动D-Bus服务器和客户端之前设置DBUS_SESSION_BUS_ADDRESS=$(cat somefile)。对我来说,这似乎有点笨拙;特别是因为我知道systemd服务文件中的"Busname"指令对于系统级D-Bus连接有一些魔法。我该如何正确地启动针对"otheruser"的systemd服务,以便这些systemd服务可以与会话D-Bus接口进行通信?