![嵌入式 Linux 启动时启动 Qt 应用程序](https://linux22.com/image/45233/%E5%B5%8C%E5%85%A5%E5%BC%8F%20Linux%20%E5%90%AF%E5%8A%A8%E6%97%B6%E5%90%AF%E5%8A%A8%20Qt%20%E5%BA%94%E7%94%A8%E7%A8%8B%E5%BA%8F.png)
我正在尝试让 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
-- Xsession
、Xserver
或中的文件之一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
。这就是为什么创建至少其中一个变体应该可行(写入文件并移动/重命名它,如果一开始没有成功)。总结一下:名称的主要候选者:.xinitrx
and .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 xterm
while you're working on it - 这对于尝试事情非常有用。
答案3
您可以将命令添加到$HOME/.xinitrc
启动 X 服务器的用户的目录中。
需要是可执行的$HOME/.xinitrc
shell 脚本(第一行#!/bin/sh
和chmod +x $HOME/.xinitrc
)。