我希望在成功图形桌面登录(例如 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
答案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
systemctl --user daemon-reload
systemctl --user enable --now <the service unit>
- 如果(2)有效;注销,然后再次登录,GUI 会自动启动。
这适用于 Gnome 登录会话,但不适用于 xmonad 登录会话,因为 xmonad 登录会话中服务未启动。
您应该检查您的设置xmonad
是否与 正确集成systemd
,尤其display-manager.service
是作为它的符号链接,请参阅:man systemd.special
。
附:
- 我知道下面的一些行
[Unit]
可能是不需要的,但我只是把它们放在那里是为了更加明确...... - 如果这不起作用那么我也没有主意了