我编写了一个示例测试服务,如下所示,
[Unit]
Description=Test service
[Service]
Type=dbus
BusName=test.sample
Restart=on-failure
ExecStart=/usr/sbin/testbin -n
StandardOutput=null
[Install]
WantedBy=multi-user.target
xorg.service
现在我希望这个服务(或单元文件)在我添加之后启动
After=xorg.service
Requires=xorg.service
到我的服务文件的单元部分并重新启动系统。但它对我的服务文件没有影响。所以我的目标是在用户会话后启动此服务(我的意思是X
出现后)。请让我知道我在这里错过了什么或者有其他替代方法来延迟它吗?
答案1
您应该确保您实际上有一个名为 的单位xorg.service
。据我所知,没有任何发行版以这种方式启动 X,因此,除非您编写了自己的xorg.service
,根本没有这样的单位。
此外,让我强调一下,仅仅在 X 服务器(或显示管理器之后)之后启动您的服务从根本上不足以使其与 X 通信。
简而言之,systemd 或任何其他 init 系统并不意味着运行用户 GUI 应用程序。虽然通过某种程度的黑客技术当然是可能的,但我不推荐它——只需坚持使用 xinitrc 即可。
答案2
首先,正如 @intelfx 所说,您应该确保 xorg.service 存在。我认为更好的做法是参考graphical.target,它是在图形系统启动时触发的。
如果该服务用于用户会话,您应该考虑使用:
systemctl --user enable test.service
这样,如果满足所有其他要求,当激活该服务的用户登录时,该服务将被触发。请注意,您的初始方法可能发生在任何用户经过身份验证之前,因此可能发生在任何用户会话之外。
如果要为所有用户启用 --user 服务,可以将其添加到 /etc/systemd/user/default.target.wants 中,以便除非用户选择退出,否则它会被激活。