【问题标题】:Qt GUI instance autostarted with systemd does not respond to input使用 systemd 自动启动的 Qt GUI 实例不响应输入
【发布时间】:2012-11-20 21:41:33
【问题描述】:

我有一个嵌入式 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 status 的输出在我看来没问题,注意最后一行 '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,就像我从命令行启动它一样?谢谢 -

【问题讨论】:

  • 可能与不同的工作目录有关。您应该检查是否使用与 systemd 相同的工作目录,您的应用程序通过命令行启动的行为仍然良好。
  • 问题可能是因为您在登录时启动它,当时还没有正确设置所有内容。我曾经遇到过 Qt 在登录时自动启动时没有在 KDE 中创建托盘图标的问题,因为它在系统托盘可用之前就启动了。你能安排程序在登录后 10-20 秒启动吗?

标签: qt embedded-linux init systemd


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-01-27
    • 1970-01-01
    • 2021-10-17
    • 2020-11-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    相关资源
    最近更新 更多