我需要在每次系统启动时运行 Qt GUI 应用程序并永远运行它。我为其创建了一个系统服务。
以下是服务文件内容:
QtGUIAPP.service
[Unit]
Description=QtGUIAPP
[Service]
Environment="DISPLAY=:0"
Environment="XAUTHORITY=/home/user/.Xauthority"
ExecStart=/usr/bin/sudo /home/user/QtGUIAPP --no-sandbox
Restart=always
[Install]
WantedBy=multi-user.target
以上操作均正常,没有任何问题。
但当我启动没有显示器的 PC 并远程访问它时,该应用程序似乎没有运行。我在系统日志中收到如下错误
Invalid MIT-MAGIC-COOKIE-1 keyQStandardPaths: XDG_RUNTIME_DIR not set, defaulting to '/tmp/runtime-root'QXcbConnection: Could not connect to display :0Could not connect to any X display.
Oct 18 12:45:55 user systemd[1]: QtGUIAPP.service: Main process exited, code=exited, status=1/FAILURE
Oct 18 12:45:55 user systemd[1]: QtGUIAPP.service: Unit entered failed state.
Oct 18 12:45:55 user systemd[1]: QtGUIAPP.service: Failed with result 'exit-code'.
Oct 18 12:45:55 user avahi-daemon[799]: Host name conflict, retrying with user-2
Oct 18 12:45:55 user avahi-daemon[799]: Registering new address record for 10.0.7.15 on enp2s0.IPv4.
Oct 18 12:45:56 user systemd[1]: QtGUIAPP.service: Service hold-off time over, scheduling restart.
我认为问题出在
Environment="DISPLAY=:0"
我如何更改上述脚本以使其在显示器连接和未连接时都能工作。
答案1
我认为如果没有 X 您就无法运行 Qt,因此您需要运行 X。如果未检测到显示器,它将不会默认启动。
我发现此 Ubuntu 论坛主题(链接到确切答案)可能有助于您解决无法连接显示器的问题:
我对 Ubuntu 不太熟悉(已经使用了 2 年了),所以可能还有其他选择可以做同样的事情。
我遇到了完全相同的问题——我想在一台(目前)没有连接显示器的机器上运行 X。
使用英特尔驱动程序,X 发现没有连接显示器,因此放弃:
(II) intel(0): Output VGA disconnected (WW) intel(0): No outputs definitely connected, trying again... (II) intel(0): Output VGA disconnected (WW) intel(0): Unable to find initial modes (EE) intel(0): No valid modes. (II) UnloadModule: "intel"
我偶然发现了一个由这些论坛和其他论坛上的几个不同帖子拼凑而成的解决方案。
首先,我需要创建一个基本
xorg.conf
文件,在其中指定 VESA 驱动程序而不是英特尔驱动程序(请参阅文章底部的我的xorg.conf
)这让我看到了一个不同的错误:
(EE) VESA: Kernel modesetting driver in use, refusing to load (WW) Falling back to old probe method for vesa (EE) No devices detected.
然后我必须添加
nomodeset
到我的 GRUB 启动选项(以前是在,/boot/grub/menu.lst
但现在在/etc/default/grub
)GRUB_CMDLINE_LINUX_DEFAULT="quiet splash nomodeset"
...然后运行
sudo update-grub
。通过对(不存在的)显示器进行一些基本设置,结果是,我可以在未插入显示器的情况下使用 VESA 驱动程序运行 X,并且具有合适的分辨率 - 这对于我的要求来说已经很好了。
文件
xorg.conf
:Section "Monitor" Identifier "Monitor0" HorizSync 31-81 VertRefresh 56-75 EndSection Section "Device" Identifier "Card0" Driver "vesa" EndSection Section "Screen" Identifier "Screen0" Device "Card0" Monitor "Monitor0" EndSection