在 systemd 服务文件中设置 DISPLAY

dog*_*ogs 14 opensuse systemd

我试图通过尝试将 xclock 作为服务启动来学习 systemd 服务;服务文件在下面

[Unit]
Description=clock

[Service]
Environment=DISPLAY=:0
ExecStart=/usr/bin/xclock

[Install]
WantedBy=graphical.target
Run Code Online (Sandbox Code Playgroud)

任何想法这里有什么问题?我收到一条错误消息,提示“无法连接到显示器”。

Gil*_*il' 21

应用程序需要两件事才能在 X 显示器上打开窗口。它需要知道X显示的位置;这是由DISPLAY环境变量传达的。它还需要与 X 服务器进行身份验证。这是通过 cookie 传达的,cookie 是 X 服务器在启动时生成的秘密值,并存储在只有启动 X 服务器的用户才能访问的文件中。默认的 cookie 文件是~/.Xauthority.

如果您的 X 服务器使用默认 cookie 文件位置,则添加Environment=XAUTHORITY=/home/dogs/.Xauthority将起作用(假设/home/dogs是在 X 下登录的用户的主目录)。如果您需要查找位置,请参阅我能否以 root 身份在其他用户的桌面上启动图形程序?远程X显示器上打开一个窗口(为什么“无法打开显示”)?

或者,以运行 X 服务器的用户身份运行程序也可以,前提是 cookie 文件位于默认位置(如果没有,您必须找到 cookie 文件,就像在根情况下一样)。添加User指令(例如User=dogs)。

当然,如果您指定的用户拥有的那个号码没有 X 显示,该服务将不会运行。

从 Systemd 启动 GUI 程序相当奇怪。它不是为此而设计的。GUI 程序存在于由用户启动的 X 会话中。Systemd 用于系统进程。您应该尝试使用守护进程。

  • 使用`systemctl --user` 不是问题。此外,`DISPLAY` 变量也不是问题。看看[这里](https://unix.stackexchange.com/a/519585/105615)。 (2认同)