1. 程式人生 > >ubuntu下圖形程式自啟動的幾種方法

ubuntu下圖形程式自啟動的幾種方法

版權宣告:本文為本文為博主原創文章,轉載請註明出處。如有問題,歡迎指正。部落格地址:https://www.cnblogs.com/wsg1100/ @[toc] ## 0.前言 在嵌入式的場合通常會讓Linux只執行某一個特定的人機互動應用程式,本文講述了在Ubuntu環境下如何配置應用自啟動,希望對你有所幫助。 ## 1.帶桌面環境的自動啟動 該方法由桌面去啟動qt程式,這裡說的桌面指**視窗管理器**如xface、gnome、kde等。 ### 1.1Ubuntu 以Ubuntu 圖形介面作為例子(這裡使用Ubuntu16.04,基於gnome開發)如下: 在當前使用者`home`下建立`autostart`目錄: ```shell mkdir -p ~/.config/autostart ``` 建立一個`**.desktop`的檔案如下: ```shell cat > ~/.config/autostart/Qt_test.desktop << EOF [Desktop Entry] Type=Application Exec=/home/Qt_test EOF ``` 有關desktop的條目含義可以參看https://specifications.freedesktop.org/desktop-entry-spec/latest/; 該方法可以達到自動啟動應用程式的效果,但在一些比如嵌入式應用環境,Ubuntu桌面環境也不需要的時候該方法就不適合,原因在於Ubuntu桌面環境太龐大,佔用資源過多。 ### 1.2 openbox Openbox 是一個輕量級、可高度定製以及支援大量標準的視窗管理器,幾乎無冗餘軟體,僅是一個視窗管理器,比較適合嵌入式應用環境。讓登入管理器來啟動openbox、QT應用程式,或者Openbox啟動QT應用程式。 1. 安裝openbox: ```bash sudo apt-get install openbox ``` 2. 配置登入管理器lightdm自動登入 3. 在`/etc/lightdm/lightdm.conf`中指定`autologin-session`使用`openbox`視窗管理器: ```shell [Seat:*] autologin-user=work autologin-session=openbox ``` 4. 在`/usr/share/xsessions/`下建立Qt程式app.desktop檔案(也可由openbox去啟動): ``` [Desktop Entry] Name=qt app Comment=This session exec qt app Exec=app-path/app [arg] TryExec=app-path/app [arg] Icon= Type=Application ``` 儲存後重啟。 附:openbox一些介面配置 安裝完成後, 你應該把預設的配置檔案 rc.xml , menu.xml , 和 autostart 和environment 複製~/.config/openbox: ```shell $ mkdir -p ~/.config/openbox $ cp /etc/xdg/openbox/{rc.xml,menu.xml,autostart,environment} ~/.config/openbox ``` ==注意: 不要用 root 進行以上操作,應使用普通使用者。== 這四個檔案組成了 Openbox 配置的基礎。每一個檔案是配置的獨立的部分,它們的功能是: **rc.xml** 本檔案是配置檔案.用於定義鍵盤快捷鍵, 主題, 虛擬桌面等。 **menu.xml** 本檔案定義了在桌面用滑鼠擊鍵時顯示的選單。它定義了程式啟動器和快捷方式。 **autostart** 本檔案在 Openbox 啟動時讀取。包含了一些需要啟動的程式,通常用來定義許多環境變數、 啟動面板/dock、設定桌布或者執行其他啟動指令碼等等。細節看 [Openbox Wiki](http://openbox.org/wiki/Help:Autostart). **menu.xml** 被 `openbox-session` 啟動時呼叫。它包含了在 Openbox 上下文中定義的變數。任何你想對 Openbox 本身可見以及從選單啟動的程式需要的變數都放在這裡。 讓Openbox作為一個單獨的視窗管理器執行,把以下內容加入` ~/.xinitrc `: ```bash exec openbox-session ``` 如果想在命令列下啟動 Openbox , 用 xinit : ```bash $ xinit /usr/bin/openbox-session ``` ## 2.使用登入管理器啟動應用 登入管理器又稱顯示管理器,可直接由顯示管理器啟動我們的應用程式。 簡要說明一下與桌面環境相關的幾個東西: ### 2.1 視窗管理器 我們熟悉的GNOME、KDE、Xface...;使用這些桌面環境應該儘量使用對應的登入管理器來啟動。 ### 2.2 登入管理器 視窗管理和X11 需要登入管理器來啟動: ​ **GDM**-GNOME登入管理器; ​ **SDDM** - 基於QML的顯示管理器和KDM的後繼者; 推薦用於 Plasma和 LXQt; ​ **XDM** - X顯示管理器,支援XDMCP; ​ **LightDM** - 跨桌面顯示管理器,可以使用任何工具包中編寫的各種前端,Ubuntu16.04預設使用該管理器。 這些桌面管理器均可安裝,安裝後只需用systemd 啟動該服即可,例如在Ubuntu16.04上安裝sddm,並啟用相應的systemd服務: ``` sudo apt-get install sddm ``` 然後設定開機啟動,當然需要先關閉自帶的LightDM服務: ``` sudo systemctl disable lightdm.service sudo systemctl enable sddm.service ``` 啟用sddm後`/etc/systemd/system/display-manager.service`應該連結到`/usr/lib/systemd/system/sddm.service` #### 2.2.1 沒有視窗管理啟動應用程式 登入管理器如何啟動視窗管理的? 大多數登入管理器會從`/usr/share/xsessions/`讀取可用的`.desktop`檔案,在安裝各種視窗管理器時會在`/usr/share/xsessions/`下生成對應的desktop檔案,比如ubuntu自帶的`ubuntu.desktop`檔案,它的配置如下: ``` [Desktop Entry] Name=Ubuntu Comment=This session logs you into Ubuntu Exec=gnome-session --session=ubuntu TryExec=untiy Icon= Type=Application DesktopNames=Unity X-Ubuntu-Gettext-Domain=gnome-session-3.0 ``` 可以在沒有任何桌面或視窗管理的情況下啟動應用程式,例如要啟動`google-chrome`只需在`/usr/share/xsessions/`下建立`web-browser.desktop`檔案如下: ``` [Desktop Entry] Name=Web Browser Comment=Use a web browser as your session Exec=/usr/bin/google-chrome --auto-launch-at-startup TryExec=/usr/bin/google-chrome --auto-launch-at-startup Icon=google-chrome Type=Application ``` **這能滿足自動啟動Qt應用需求,systemd啟動登入管理器,登入管理器登入後去啟動QT應用程式。這裡還需要設定[登入管理器自動登入配置](#index),達到自動啟動目的。 缺點:不易除錯。** 登入管理器與使用者會話相關的配置檔案`/var/lib/AccountsService/user/$USER`,使用視窗管理器登入對應的使用者後會使用該配置檔案中的設定,比如桌面背景圖等,ubuntu的背景圖配置就是配置這個檔案,下面是一個本機上的示例(加了一些註釋): ``` [com.canonical.indicator.sound.AccountsService] PlayerName='' Timestamp=0 Title='' Artist='' Album='' ArtUrl='' PlayerIcon=<('themed', <['application-default-icon', 'application-default', 'application']>)> [InputSource0] xkb=us #鍵盤型別 [User] XSession=ubuntu #會話名稱 Language=en_GB.UTF-8 #語言 Background=/home/work/Pictures/backgroundDefault.jpg #桌面背景 SystemAccount=false ``` #### 2.2.2 登入管理器自動登入配置 這裡使用Ubuntu 16.04自帶的lightdm說明,其他登入管理器自行查詢相關文件: 啟用lightdm使用systemctl,以便啟動時啟動: ``` sudo systemctl enable lightdm.service sudo systemctl start lightdm.service ``` `LightDM`可以通過修改其配置檔案`/etc/lightdm/lightdm.conf`來配置,編輯該檔案,配置這些行: ``` [Seat:*] autologin-user = username ``` username必須是該autologin 群組的一員才能在不輸入密碼的情況下自動登入: ``` #groupadd -r autologin #gpasswd -a username autologin ``` `LightDM`使用`~/.dmrc`使用者指定的會話登入為自動登入。要覆蓋此檔案需要在`/etc/lightdm/lightdm.conf`中指定`autologin-session`: ``` [Seat:*] autologin-user = username autologin-session = session ``` 有效`session`名稱列表可以通過列出X 的會話`/usr/share/xsessions/*.desktop` 和Wayland的列表`/usr/share/wayland-sessions/*.desktop` 來找到。 檢視當前系統啟動了哪些會話視窗: ```shell loginctl ``` ### 2.3 xorg X.Org 專案提供了 X 視窗系統的開源實現。開發工作是在freedesktop.org 社群的通力合作下完成。X.Org 組織是非盈利教育機構。Xorg 在 Linux 中非常流行,已經成為linux圖形使用者程式的必備條件,所以大部分發行版都提供了它. 使用者通常需要選擇安裝某個 [視窗管理器](#index ) 或 [桌面環境](#index)以配合使用 X。 #### 2.3.1 xinit(startx) 如果不用登陸管理器啟動 X顯示服務,可以使用`xinit`手動啟動Xorg顯示服務。 執行`xinit`和`startx`時,它們將尋找`~/.xinitrc`作為shell指令碼執行以啟動客戶端程式。 如果`~/.xinitrc`不存在,`startx將`執行預設值`/etc/X11/xinit/xinitrc`(預設的xinitrc啟動一個Twm,xorg-xclock和Xterm環境),ubuntu安裝後的`/etc/X11/xinit/xinitrc`檔案如下: ```bash #!/bin/bash . /etc/X11/Xsession ``` #### 2.3.2 xserverrc xserverrc 檔案是負責啟動X伺服器的shell指令碼,執行`startx`和`xinit`執行`~/.xserverrc`,如果`~/.xserverrc`不存在`startx`會用`/etc/X11/xinit/xserverrc`,內容如下: ```bash #!/bin/sh exec /usr/bin/X -nolisten tcp "$@" ``` 啟動X11,` -nolisten tcp` 禁用X11的抽象套接字。 要執行Xorg,直接執行: ``` $startx ``` 如果配置了xserverrrc: ```bash $xinit -- :1 ``` **注意**:當另一個X伺服器已經啟動時,xinit不處理多個顯示。對於必須通過附加指定顯示,這裡是以上。-- :display_number display_number 1 要退出X,直接執行視窗管理器的退出功能,如果沒有視窗管理器,執行: ```bash $ pkill -15 Xorg ``` pkill將終止所有正在執行的X例項,要專門終止當前虛擬終端上的視窗管理器: ```bash $ pkill -15 -t tty“$ XDG_VTNR”Xorg ``` #### 2.3.3沒有視窗管理器啟動應用程式 可以在沒有視窗管理器的情況下僅啟動特定應用程式,儘管這很可能僅適用於以全屏模式顯示的單個應用程式。例如`~/.xinitrc`: ``` ... exec Qt_tese ``` **缺點:非自動啟動,而是手動輸入`startx`命令