Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用systemd自动启动的Qt GUI实例不响应输入_Qt_Embedded Linux_Init_Systemd - Fatal编程技术网

使用systemd自动启动的Qt GUI实例不响应输入

使用systemd自动启动的Qt GUI实例不响应输入,qt,embedded-linux,init,systemd,Qt,Embedded Linux,Init,Systemd,我有一个嵌入式Linux板,它使用systemd进行启动过程。我还有一个用Qt编写的GUI,我可以从命令行很好地启动它,并使用板上的触摸屏或按钮进行交互。要启动应用程序,我通常会执行以下操作: ssh root@192.168.1.2 cd ~/ ./gui 我希望使用SystemD自动启动,因此我编写了一个如下所示的服务文件: [Unit] Description=The Qt Gui After=dropbear.service systemd-logind.service Conditi

我有一个嵌入式Linux板,它使用systemd进行启动过程。我还有一个用Qt编写的GUI,我可以从命令行很好地启动它,并使用板上的触摸屏或按钮进行交互。要启动应用程序,我通常会执行以下操作:

ssh root@192.168.1.2
cd ~/
./gui
我希望使用SystemD自动启动,因此我编写了一个如下所示的服务文件:

[Unit]
Description=The Qt Gui
After=dropbear.service systemd-logind.service
ConditionFileIsExecutable=/home/user/gui

[Service]
ExecStart=/home/user/gui
Restart=on-abort

[Install]
WantedBy=multi-user.target
当主板启动时,我在systemd日志中看到它在dropbear SSH服务之后立即启动gui:

[  OK  ] Started Dropbear SSH2 daemon.
         Starting The Qt Gui...
[  OK  ] Started The Qt Gui. 
如果我在主板启动并运行“ps”后SSH到主板,我可以看到我的进程启动了(如果我杀死它,它会按照systemd的预期重新启动):

systemctl status的输出在我看来是正常的,请注意最后一行“ARM build”是我代码中的qDebug()print语句:

gui.service - The Qt Gui
      Loaded: loaded (/etc/systemd/system/gui.service; enabled)
      Active: active (running) since Tue, 2012-11-20 21:30:20 UTC; 4min 35s ago
    Main PID: 196 (gui)
      CGroup: name=systemd:/system/gui.service
          └ 196 /home/user/gui

Nov 20 21:30:20 systemd[1]: Starting The Qt Gui...
Nov 20 21:30:20 systemd[1]: Started The Qt Gui.
Nov 20 21:30:22 gui[196]: ARM build

但是,我根本无法与使用systemd启动的GUI实例进行交互!如果我从命令行启动一个辅助实例,那么我可以按下按钮或触摸屏,屏幕上会弹出GUI并按预期工作。有什么好处?我在服务文件中尝试了“Type=forking”,但这也没有帮助。你知道这里出了什么问题吗?我如何让systemd像从命令行一样启动QtGUI?谢谢-

谢谢您的上述意见。这实际上不是一个工作目录或时间问题。问题是我的Qt GUI没有获得与触摸屏通信所需的适当环境变量。为我工作的采购/etc/profile:

[Unit]
Description=The Qt Gui
After=dropbear.service
ConditionFileIsExecutable=/home/user/gui

[Service]
Type=simple
TimeoutStartSec=60
WorkingDirectory=/home/user
ExecStartPre=/bin/sh -c 'echo 127 > /sys/class/backlight/generic-bl/brightness'
ExecStart=/bin/sh -c 'source /etc/profile ; /home/user/gui -qws'
Restart=always

[Install]
WantedBy=multi-user.target

可能与不同的工作目录有关。您应该检查是否使用与systemd相同的工作目录,您的应用程序是否仍然通过命令行启动。问题可能是因为您是在登录时启动它的,而不是所有内容都已正确设置。我曾经遇到一个问题,Qt在登录时自动启动时没有在KDE中创建托盘图标,因为它是在系统托盘可用之前启动的。你能安排程序在登录后10-20秒启动吗?
[Unit]
Description=The Qt Gui
After=dropbear.service
ConditionFileIsExecutable=/home/user/gui

[Service]
Type=simple
TimeoutStartSec=60
WorkingDirectory=/home/user
ExecStartPre=/bin/sh -c 'echo 127 > /sys/class/backlight/generic-bl/brightness'
ExecStart=/bin/sh -c 'source /etc/profile ; /home/user/gui -qws'
Restart=always

[Install]
WantedBy=multi-user.target