在嵌入式 Linux 啟動時啟動 Qt 應用程序
我試圖讓 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/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
or/etc/X11/
中,但如果在後面,放棄前導點。