如何编写仅作为图形会话的一部分运行的 systemd 用户服务?

如何编写仅作为图形会话的一部分运行的 systemd 用户服务?

我希望在成功图形桌面登录(例如 Gnome 或 Xmonad)后自动启动某些程序,并在注销时自动停止。如何更改~/.config/systemd/user/synergys.service文件以正确执行上述操作?

现在启用服务后,根据journalctl --user,该服务在我登录时尝试启动,但失败并显示

Invalid MIT-MAGIC-COOKIE-1...

我认为这基本上意味着它无法显示。当我登录后手动启动它时,就很好了。我怀疑该服务在显示之前启动得太早,因为WantedBy=default.target它不是特定于 GUI 登录的,甚至文本登录也会触发它。

我已经尝试过了,graphical-session.target但毫无结果。这是在 Ubuntu 20.04 上。

[Unit]
Description=Synergy Server

[Service]
ExecStart=/usr/bin/synergys --no-daemon --no-tray --address :: --serial-key XXXX --enable-crypto
Restart=always
RestartSec=3

[Install]
WantedBy=default.target

我知道我可以手动运行该程序作为桌面会话“启动”程序,但这种方式不会在失败时提供自动重试。

答案1

我有一个类似的用例,我想注册一个在图形会话之后运行的 X11 服务,其中完整的 X11 堆栈在我的用户服务运行之前已经启动。

X11 程序要求在服务环境中设置DISPLAY和环境变量,否则它们将无法启动。XAUTHORITY不幸的是,没有很好地解释哪些 systemd 目标公开了这些环境变量。

在我的 GNOME 桌面上,我能够通过指定我的服务是由graphical-session.target

[Install]
WantedBy=graphical-session.target

也可以看看:https://superuser.com/q/759759/194998

答案2

您尝试过以下方法吗?

[Unit]
Description=Synergy Server
After=graphical-session.target
BindsTo=graphical-session.target
PartOf=graphical-session.target
Requisite=graphical-session.target
ConditionEnvironment=DISPLAY
ConditionEnvironment=XAUTHORITY

[Service]
ExecStart=/usr/bin/synergys --no-daemon --no-tray --address :: --serial-key XXXX --enable-crypto
Restart=always
RestartSec=3

[Install]
WantedBy=graphical-session.target
  1. systemctl --user daemon-reload
  2. systemctl --user enable --now <the service unit>
  3. 如果(2)有效;注销,然后再次登录,GUI 会自动启动。

@切分音

这适用于 Gnome 登录会话,但不适用于 xmonad 登录会话,因为 xmonad 登录会话中服务未启动。

您应该检查您的设置xmonad是否与 正确集成systemd,尤其display-manager.service是作为它的符号链接,请参阅:man systemd.special


附:

  • 我知道下面的一些行[Unit]可能是不需要的,但我只是把它们放在那里是为了更加明确......
  • 如果这不起作用那么我也没有主意了

相关内容