我有一个用Go
编写的小程序,它使用go-systemd库通过dbus与systemd交互。
程序本身注册为systemd单元,并应在 Boot 时启动。当程序运行时,它会定期查询几个单元的systemd单元状态。
现在当我手动启动程序时,一切都很好。但是,当由systemd重新引导后启动时,它将“挂起”,这意味着它将无法通过dbus查询systemd单元状态。我将从go-systemd
库获得以下消息:
Process org.freedesktop.systemd1 exited with status 1
字符串
现在当我只是重新启动我的程序,它将立即能够查询systemd单位没有错误。这导致我假设我的程序存在错误/错误配置的依赖项,因此在 Boot 时将出现争用条件,导致程序无法通过dbus与systemd通信。
现在我已经把这个,和其他几个组合,但它没有帮助:
Requires=dbus.service
After=dbus.service
Wants=org.freedesktop.systemd1
型
我需要如何配置我自己的systemd单元(go-program的),以便它能够在重启后立即通过dbus与systemd通信?我需要配置什么依赖关系?
1条答案
按热度按时间gorkyyrv1#
这听起来像是你的程序在默认情况下试图连接到DBus会话总线,因为你说当你手动运行它时它工作得很好。当应用程序从Systemd启动时,默认情况下它将以root身份运行,没有会话总线可供连接,因此它将失败。
当用户在图形终端上登录时,会话总线通常在每次登录的基础上启动。默认情况下,在终端上登录时不会启动。
如果是这样的话,我现在可以看到两种选择:
1.使用系统总线而不是会话总线。
1.创建您自己的总线,与会话总线和系统总线不同。最简单的方法是使用
dbus-launch
创建一个新的总线,您的应用程序可以连接到该总线。