嵌入式 Linux 启动时启动 Qt 应用程序

嵌入式 Linux 启动时启动 Qt 应用程序

我正在尝试让 Qt 应用程序在启动后立即启动。启动时,Linux 映像除了启动 X 服务器和终端外什么也不做。它还具有在后台运行的 cron 守护进程。显然,我的 Qt 应用程序需要运行 X 服务器才能执行任何操作。

我见过一个类似的问题适用于 Red Hat 和 SUSE Linux。

但是,我认为这对我的形象不起作用。

我想知道 Linux/UNIX 中是否有一种标准方法可以使 GUI 应用程序在 X Server 之后立即启动。


[sj755@localhost X11]$ tree /etc/X11/
/etc/X11/
|-- functions
|-- Xdefaults
|-- Xinit
|-- Xinit.d
|   |-- 01xrandr
|   |-- 11zaurus
|   |-- 12keymap
|   |-- 40xmodmap
|   |-- 50setdpi
|   |-- 55xScreenSaver
|   |-- 60xXDefaults
|   |-- 89xTs_Calibrate
|   `-- 98keymap-fixup
|-- xmodmap
|   |-- a716.xmodmap
|   |-- collie.xmodmap
|   |-- default.xmodmap
|   |-- h1910.xmodmap
|   |-- h2200.xmodmap
|   |-- h6300.xmodmap
|   |-- hx4700.xmodmap
|   |-- keyboardless.xmodmap
|   |-- omap5912osk.xmodmap
|   |-- poodle.xmodmap
|   |-- shepherd.xmodmap
|   |-- simpad.xmodmap
|   |-- slcXXXX.xmodmap
|   |-- xmodmap-invert
|   |-- xmodmap-left
|   |-- xmodmap-portrait
|   `-- xmodmap-right
|-- xorg.conf
|-- Xserver
|-- xserver-common
|-- Xsession
`-- Xsession.d
    |-- 60xXDefaults
    |-- 89xdgautostart
    `-- 90xXWindowManager

3 directories, 36 files

root@devboard:~# cat /etc/X11/Xsession.d/90xXWindowManager
if [ -x $HOME/.Xsession ]; then
    exec $HOME/.Xsession
elif [ -x /usr/bin/x-session-manager ]; then
    exec /usr/bin/x-session-manager
else
    exec /usr/bin/x-window-manager
fi

#!/bin/sh
#
# Very simple session manager for Mini X
#

# Uncomment below to enable parsing of debian menu entrys
# export MB_USE_DEB_MENUS=1 

if [ -e $HOME/.mini_x/session ]
then
exec $HOME/.mini_x/session
fi

if [ -e /etc/mini_x/session ]
then
exec /etc/mini_x/session
fi

MINI_X_SESSION_DIR=/etc/mini_x/session.d
if [ -d "$MINI_X_SESSION_DIR" ]; then
    # Execute session file on behalf of file owner
    find $MINI_X_SESSION_DIR -type f | while read SESSIONFILE; do
        set +e
        USERNAME=`stat -c %U $SESSIONFILE`
        # Using su rather than sudo as latest 1.8.1 cause failure [YOCTO #1211]
#       su -l -c '$SESSIONFILE&' $USERNAME
        sudo -b -i -u $USERNAME $SESSIONFILE&
        set -e
    done
fi

# This resolution is big enough for hob2's max window size.
xrandr -s 1024x768

# Default files to run if $HOME/.mini_x/session or /etc/mini_x/session
# don't exist. 

matchbox-terminal&
exec matchbox-window-manager

答案1

看一下/etc/X11/xinit/xinitrc(这可能在不同系统上的不同位置)以查看它来源的文件。通常,这将具有 if..elif..else 结构,以便仅读取一个初始化文件,并$HOME/.Xclients优先考虑 then /etc/X11/xinit/Xclients。这几乎肯定是出现的终端的来源(我假设您没有安装桌面环境或任何东西)。

无论如何,如果您只想运行单个 GUI 应用程序,请创建(或修改)一个 Xclients 文件,如下所示:

#!/bin/sh

myGUIapp

这应该是可执行的。我相信,这几乎是一个普通的 shell 脚本,因此您可以在其中包含更多内容,尽管显然不后台 GUI 应用程序会在此时阻止执行。

[稍后补充]

您的安装并不完全具有这些文件,但它确实有一个,/etc/X11/Xinit.d如果您查看,我确信这些都是简短的 shell 脚本,它们来自某个地方,可能是/etc/X11-- XsessionXserver或中的文件之一xserver-common。您可能想检查$XINITRC您的环境中是否定义了;这将是一个线索。

你最好的选择可能就是创建一个$HOME/.Xclients文件(或者如 jofel 提到的,$HOME/.xinitrc,这可能更通用)并尝试一下 - 正是这种拼写和大小写,带有前导点,并且应该设置它chmod 755(组和其他权限可能没关系)。几乎可以肯定,这将来自正确的地方。

您可以自己放入文件/etc/X11/Xinit.d,但为此目的这样做并不是一个好主意,因为您的文件应该最后运行并阻止进一步执行。因此,请查看 中的脚本/etc/X11(再次强调:Xsession等,它们没有后缀.sh),并尝试找出它们以什么顺序链接在一起。也有可能其中一个在某个地方检查文件Xclients,例如通过类似的方式

if [ -x /some/path/Xclients ]; then

$HOME也可以使用 和.xinitrc。这就是为什么创建至少其中一个变体应该可行(写入文件并移动/重命名它,如果一开始没有成功)。总结一下:名称的主要候选者:.xinitrxand .Xclients,在 或 中$HOME/etc/X11/但如果在后者中,则放弃前导点。

答案2

首先,“这并不一定是显而易见的”我的 Qt 应用程序需要运行 X 服务器才能执行任何操作“ - 我已经成功地使用linuxfb来自 的后端运行 Qt5 应用程序upstart。如果您能做到这一点,您将获得比通过 X 更快的启动速度和更低的内存使用量。另一方面,您可能希望它启动 X11 客户端程序,或者需要一个窗口管理器,所以它并不适合所有人。

现在假设您的应用程序确实需要 X 服务器,请查看nodm显示管理器。这是为嵌入式应用程序设计的;我将它用于 MythTV 前端。它比干预 中的脚本要干净得多/etc/X11/,并且使您能够为不同的用户进行不同的设置,这在开发过程中可能会很方便。

它非常容易使用;在 Debian 安装中,只需编辑/etc/default/nodm以启用 nodm 并指定所需的用户名。其他默认值可能没问题。

然后为该用户提供一个合适的~/.xinitrc- 在最简单的情况下,您可以将其作为您的应用程序的符号链接。但它更有可能是一个简短的/bin/sh脚本,可能会设置背景、安装键盘映射、启动屏幕保护程序以及您之前喜欢的任何其他细节exec myapplication

提示 - 将最后一行替换为exec xtermwhile you're working on it - 这对于尝试事情非常有用。

答案3

您可以将命令添加到$HOME/.xinitrc启动 X 服务器的用户的目录中。

需要是可执行的$HOME/.xinitrcshell 脚本(第一行#!/bin/shchmod +x $HOME/.xinitrc)。

相关内容