我想在启动时启动 Qt 应用程序。该应用程序使用了 weston/wayland 桌面的一些功能,因此应该在 weston 启动后立即在 weston 之上启动。通常,我使用 SSH 连接到目标平台并使用以下命令启动应用程序:
systemctl stop weston
weston --tty=1
./QtApp
如果我不杀死 weston 并且不使用 TTY 启动它,我会收到以下错误:
Failed to create display
我尝试做的是设置一个启动脚本并将其集成到 systemd 中:
[Unit]
Description = Onyx Service
After = weston.service
Type = forking
[Service]
ExecStart = /bin/bash /opt/onyx-start
[Install]
WantedBy = multi-user.target
然而,正如您可以猜到的那样,这是行不通的。我需要设法在未使用 TTY 选项启动的现有 weston 实例上启动应用程序。
答案1
通常,这不是在特定的 tty 上启动 Weston,而是设置环境变量,将您路由到 Wayland 和 Weston 的正确实例。这些变量WAYLAND_DISPLAY
甚至适用于DISPLAY
需要 XWayland 的应用程序。
/etc/profile.d/weston.sh
您通常可以通过获取诸如(或在某些情况下)之类的文件来获得所需的正确环境wayland_env.sh
。这通常是在您登录 shell 时为您完成的,但 systemd 作业不会启动 shell,因此它们不会设置这些变量。
也许尝试这样的事情onyx-start
:
#!/bin/sh
. /etc/profile.d/weston.sh
exec /path/to/QtApp
您拥有的服务单位应该与此合作。
(如果仍然不起作用,请列出有关您的环境的更多详细信息,例如您正在使用的 Linux 发行版、 的内容weston.service
、 的输出、或systemctl status weston.service
的内容以及是否通过 SSH 启动 QtApp 而不启动新的 Weston,也许获取环境配置文件后,如果由于任何原因未在这些连接上设置这些变量。)weston.sh
wayland_env.sh
答案2
要添加@filbranden的答案,/etc/profile.d/weston.sh
或者wayland_env.sh
不再分发,所以对我有用的是以下脚本:
#!/bin/bash
weston &
sleep 5s # could be less
export WAYLAND_DISPLAY=wayland-0
export DISPLAY=:1
exec /path/to/myapp