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

时间:2012-11-20 21:41:34

标签: 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
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. 

如果我在启动后通过SSH连接到电路板并运行“ps'我可以看到我的进程已经启动(如果我将其杀死,它将按照systemd的预期重新启动):

196 root     26868 S    /home/user/gui

systemctl状态的输出对我来说没问题,请注意最后一行' ARM build'是我的代码中的qDebug()打印语句:

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启动我的Qt GUI就像我从命令行那样做?谢谢 -

1 个答案:

答案 0 :(得分:1)

感谢上面的输入。它实际上不是工作目录或计时问题。问题是我的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