Linux

在嵌入式 Linux 啟動時啟動 Qt 應用程序

  • October 16, 2016

我試圖讓 Qt 應用程序在啟動後立即啟動。啟動時,Linux 映像僅啟動 X 伺服器和終端。它還在後台執行 cron 守護程序。顯然,我的 Qt 應用程序需要執行 X 伺服器才能執行任何操作。

我在 Red Hat 和 SUSE Linux 上看到過類似的問題

但是,我認為這對我的形像不起作用。

我想知道 Linux/UNIX 中是否有一種標準方法可以在 X 伺服器之後立即啟動 GUI 應用程序。


[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

看一下/etc/X11/xinit/xinitrc(這可能是不同系統上的不同位置)以查看它來源的文件。通常,這將具有 if..elif..else 結構,因此僅讀取一個初始化文件,$HOME/.Xclients優先級為 then /etc/X11/xinit/Xclients。這幾乎肯定是出現的終端的來源(我假設您沒有安裝桌面環境或任何東西)。

無論如何,如果您只想執行單個 GUI 應用程序,請創建(或修改)一個 Xclients 文件,如下所示:

#!/bin/sh

myGUIapp

這應該是可執行的。我相信這幾乎是一個普通的 shell 腳本,所以你可以在裡面有更多的東西,雖然很明顯沒有後台 GUI 應用程序會阻止執行。

$$ later addition $$

您的安裝沒有這些文件,但它確實有一個/etc/X11/Xinit.d,如果你看,我相信這些是簡短的 shell 腳本,它們來自某個地方,可能是/etc/X11XsessionXserverxserver-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,在其中一個$HOMEor/etc/X11/中,但如果在後面,放棄前導點。

引用自:https://unix.stackexchange.com/questions/83511