【原创】ubuntu下图形程序自启动的几种方法
<p>版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/<br>@</p><div class="toc"><div class="toc-container-header">目录</div><ul><li>0.前言</li><li>1.带桌面环境的自动启动<ul><li>1.1Ubuntu</li><li>1.2 openbox</li></ul></li><li>2.使用登录管理器启动应用<ul><li>2.1 窗口管理器</li><li>2.2 登录管理器<ul><li>2.2.1 没有窗口管理启动应用程序</li><li>2.2.2 登录管理器自动登录配置</li></ul></li><li>2.3 xorg<ul><li>2.3.1 xinit(startx)</li><li>2.3.2 xserverrc</li><li>2.3.3没有窗口管理器启动应用程序</li></ul></li></ul></li></ul></div><p></p>
<h2 id="0前言">0.前言</h2>
<p>在嵌入式的场合通常会让Linux只执行某一个特定的人机交互应用程序,比如一个QT应用,本文讲述了在Ubuntu环境下如何配置应用自启动,希望对你有所帮助。</p>
<h2 id="1带桌面环境的自动启动">1.带桌面环境的自动启动</h2>
<p>该方法由桌面去启动qt程序,这里说的桌面指<strong>窗口管理器</strong>如xface、gnome、kde等。</p>
<h3 id="11ubuntu">1.1Ubuntu</h3>
<p>以Ubuntu 图形界面作为例子(这里使用Ubuntu16.04,基于gnome开发)如下:</p>
<p>在当前用户<code>home</code>下创建<code>autostart</code>目录:</p>
<pre><code class="language-shell">mkdir -p ~/.config/autostart
</code></pre>
<p>创建一个<code>**.desktop</code>的文件如下:</p>
<pre><code class="language-shell">cat > ~/.config/autostart/Qt_test.desktop << EOF
Type=Application
Exec=/home/Qt_test
EOF
</code></pre>
<p>有关desktop的条目含义可以参看https://specifications.freedesktop.org/desktop-entry-spec/latest/;</p>
<p>该方法可以达到自动启动应用程序的效果,但在一些比如嵌入式应用环境,Ubuntu桌面环境也不需要的时候该方法就不适合,原因在于Ubuntu桌面环境太庞大,占用资源过多。</p>
<h3 id="12-openbox">1.2 openbox</h3>
<p>Openbox 是一个轻量级、可高度定制以及支持大量标准的窗口管理器,几乎无冗余软件,仅是一个窗口管理器,比较适合嵌入式应用环境。让登录管理器来启动openbox、QT应用程序,或者Openbox启动QT应用程序。</p>
<ol>
<li>安装openbox:</li>
</ol>
<pre><code class="language-bash">sudo apt-get install openbox
</code></pre>
<ol start="2">
<li>
<p>配置登录管理器lightdm自动登录</p>
</li>
<li>
<p>在<code>/etc/lightdm/lightdm.conf</code>中指定<code>autologin-session</code>使用<code>openbox</code>窗口管理器:</p>
<pre><code class="language-shell">
autologin-user=work
autologin-session=openbox
</code></pre>
</li>
<li>
<p>在<code>/usr/share/xsessions/</code>下创建Qt程序app.desktop文件(也可由openbox去启动):</p>
</li>
</ol>
<pre><code>
Name=qt app
Comment=This session exec qt app
Exec=app-path/app
TryExec=app-path/app
Icon=
Type=Application
</code></pre>
<p>保存后重启。</p>
<p>附:openbox一些界面配置</p>
<p>安装完成后, 你应该把默认的配置文件 rc.xml , menu.xml , 和 autostart 和environment 复制~/.config/openbox:</p>
<pre><code class="language-shell">$ mkdir -p ~/.config/openbox
$ cp /etc/xdg/openbox/{rc.xml,menu.xml,autostart,environment} ~/.config/openbox
</code></pre>
<p><mark>注意: 不要用 root 进行以上操作,应使用普通用户。</mark></p>
<p>这四个文件组成了 Openbox 配置的基础。每一个文件是配置的独立的部分,它们的功能是:</p>
<p><strong>rc.xml</strong><br>
本文件是配置文件.用于定义键盘快捷键, 主题, 虚拟桌面等。</p>
<p><strong>menu.xml</strong><br>
本文件定义了在桌面用鼠标击键时显示的菜单。它定义了程序启动器和快捷方式。</p>
<p><strong>autostart</strong><br>
本文件在 Openbox 启动时读取。包含了一些需要启动的程序,通常用来定义许多环境变量、<br>
启动面板/dock、设置壁纸或者执行其他启动脚本等等。细节看 Openbox Wiki.</p>
<p><strong>menu.xml</strong><br>
被 <code>openbox-session</code> 启动时调用。它包含了在 Openbox 上下文中定义的变量。任何你想对 Openbox 本身可见以及从菜单启动的程序需要的变量都放在这里。</p>
<p>让Openbox作为一个单独的窗口管理器运行,把以下内容加入<code>~/.xinitrc</code>:</p>
<pre><code class="language-bash">exec openbox-session
</code></pre>
<p>如果想在命令行下启动 Openbox , 用 xinit :</p>
<pre><code class="language-bash">$ xinit /usr/bin/openbox-session
</code></pre>
<h2 id="2使用登录管理器启动应用">2.使用登录管理器启动应用</h2>
<p>登录管理器又称显示管理器(display manager),其实就是登陆界面,它会负责启动 display server 以启动桌面环境,它还可以直接启动我们的应用程序。</p>
<p>简要说明一下与桌面环境相关的几个东西:</p>
<h3 id="21-窗口管理器">2.1 窗口管理器</h3>
<p>我们熟悉的GNOME、KDE、Xface...;使用这些桌面环境应该尽量使用对应的登录管理器来启动。</p>
<h3 id="22-登录管理器">2.2 登录管理器</h3>
<p>窗口管理和X11 需要登录管理器来启动:</p>
<p> <strong>GDM</strong>-GNOME登录管理器;</p>
<p> <strong>SDDM</strong> - 基于QML的显示管理器和KDM的后继者; 推荐用于 Plasma和 LXQt;</p>
<p> <strong>XDM</strong> - X显示管理器,支持XDMCP;</p>
<p> <strong>LightDM</strong> - 跨桌面显示管理器,可以使用任何工具包中编写的各种前端,Ubuntu16.04默认使用该管理器。<br>
这些桌面管理器均可安装,安装后只需用systemd 启动该服即可,例如在Ubuntu16.04上安装sddm,并启用相应的systemd服务:</p>
<pre><code>sudo apt-get install sddm
</code></pre>
<p>然后设置开机启动,当然需要先关闭自带的LightDM服务:</p>
<pre><code>sudo systemctl disable lightdm.service
sudo systemctl enable sddm.service
</code></pre>
<p>启用sddm后<code>/etc/systemd/system/display-manager.service</code>应该链接到<code>/usr/lib/systemd/system/sddm.service</code></p>
<h4 id="221-没有窗口管理启动应用程序">2.2.1 没有窗口管理启动应用程序</h4>
<p>登录管理器如何启动窗口管理的?</p>
<p>大多数登录管理器会从<code>/usr/share/xsessions/</code>读取可用的<code>.desktop</code>文件,在安装各种窗口管理器时会在<code>/usr/share/xsessions/</code>下生成对应的desktop文件,比如ubuntu自带的<code>ubuntu.desktop</code>文件,它的配置如下:</p>
<pre><code>
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
</code></pre>
<p>可以在没有任何桌面或窗口管理的情况下启动应用程序,例如要启动<code>google-chrome</code>只需在<code>/usr/share/xsessions/</code>下创建<code>web-browser.desktop</code>文件如下:</p>
<pre><code>
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
</code></pre>
<p>**这能满足自动启动Qt应用需求,systemd启动登录管理器,登录管理器登录后去启动QT应用程序。这里还需要设置登录管理器自动登录配置,达到自动启动目的。<br>
**</p>
<p>登录管理器与用户会话相关的配置文件<code>/var/lib/AccountsService/user/$USER</code>,使用窗口管理器登录对应的用户后会使用该配置文件中的设置,比如桌面背景图等,ubuntu的背景图配置就是配置这个文件,下面是一个本机上的示例(加了一些注释):</p>
<pre><code>
PlayerName=''
Timestamp=0
Title=''
Artist=''
Album=''
ArtUrl=''
PlayerIcon=<('themed', <['application-default-icon', 'application-default', 'application']>)>
xkb=us #键盘类型
XSession=ubuntu #会话名称
Language=en_GB.UTF-8 #语言
Background=/home/work/Pictures/backgroundDefault.jpg #桌面背景
SystemAccount=false
</code></pre>
<h4 id="222-登录管理器自动登录配置">2.2.2 登录管理器自动登录配置</h4>
<p>这里使用Ubuntu 16.04自带的lightdm说明,其他登录管理器自行查询相关文档:</p>
<p>启用lightdm使用systemctl,以便启动时启动:</p>
<pre><code>sudo systemctl enable lightdm.service
sudo systemctl start lightdm.service
</code></pre>
<p><code>LightDM</code>可以通过修改其配置文件<code>/etc/lightdm/lightdm.conf</code>来配置,编辑该文件,配置这些行:</p>
<pre><code>
autologin-user = username
</code></pre>
<p>username必须是该autologin 群组的一员才能在不输入密码的情况下自动登录:</p>
<pre><code>#groupadd -r autologin
#gpasswd -a username autologin
</code></pre>
<p><code>LightDM</code>使用<code>~/.dmrc</code>用户指定的会话登录为自动登录。要覆盖此文件需要在<code>/etc/lightdm/lightdm.conf</code>中指定<code>autologin-session</code>:</p>
<pre><code>
autologin-user = username
autologin-session = session
</code></pre>
<p>有效<code>session</code>名称列表可以通过列出X 的会话<code>/usr/share/xsessions/*.desktop</code> 和Wayland的列表<code>/usr/share/wayland-sessions/*.desktop</code> 来找到。</p>
<p>查看当前系统启动了哪些会话窗口:</p>
<pre><code class="language-shell">loginctl
</code></pre>
<h3 id="23-xorg">2.3 xorg</h3>
<p>X.Org 项目提供了 X 窗口系统的开源实现。开发工作是在freedesktop.org 社区的通力合作下完成。X.Org 组织是非盈利教育机构。Xorg 在 Linux 中非常流行,已经成为linux图形用户程序的必备条件,所以大部分发行版都提供了它.</p>
<p>用户通常需要选择安装某个 窗口管理器 或桌面环境以配合使用 X。</p>
<h4 id="231-xinitstartx">2.3.1 xinit(startx)</h4>
<p>如果不用登陆管理器启动 X显示服务,可以使用<code>xinit</code>手动启动Xorg显示服务。</p>
<p>执行<code>xinit</code>和<code>startx</code>时,它们将寻找<code>~/.xinitrc</code>作为shell脚本运行以启动客户端程序。</p>
<p>如果<code>~/.xinitrc</code>不存在,<code>startx将</code>运行默认值<code>/etc/X11/xinit/xinitrc</code>(默认的xinitrc启动一个Twm,xorg-xclock和Xterm环境),ubuntu安装后的<code>/etc/X11/xinit/xinitrc</code>文件如下:</p>
<pre><code class="language-bash">#!/bin/bash
. /etc/X11/Xsession
</code></pre>
<h4 id="232-xserverrc">2.3.2 xserverrc</h4>
<p>xserverrc 文件是负责启动X服务器的shell脚本,运行<code>startx</code>和<code>xinit</code>执行<code>~/.xserverrc</code>,如果<code>~/.xserverrc</code>不存在<code>startx</code>会用<code>/etc/X11/xinit/xserverrc</code>,内容如下:</p>
<pre><code class="language-bash">#!/bin/sh
exec /usr/bin/X -nolisten tcp "$@"
</code></pre>
<p>启动X11,<code> -nolisten tcp</code> 禁用X11的抽象套接字。<br>
要运行Xorg,直接执行:</p>
<pre><code>$startx
</code></pre>
<p>如果配置了xserverrrc:</p>
<pre><code class="language-bash">$xinit -- :1
</code></pre>
<p><strong>注意</strong>:当另一个X服务器已经启动时,xinit不处理多个显示。对于必须通过附加指定显示,这里是以上。-- :display_number display_number 1</p>
<p>要退出X,直接运行窗口管理器的退出功能,如果没有窗口管理器,执行:</p>
<pre><code class="language-bash">$ pkill -15 Xorg
</code></pre>
<p>pkill将终止所有正在运行的X实例,要专门终止当前虚拟终端上的窗口管理器:</p>
<pre><code class="language-bash">$ pkill -15 -t tty“$ XDG_VTNR”Xorg
</code></pre>
<h4 id="233没有窗口管理器启动应用程序">2.3.3没有窗口管理器启动应用程序</h4>
<p>可以在没有窗口管理器的情况下仅启动特定应用程序,尽管这很可能仅适用于以全屏模式显示的单个应用程序。例如<code>~/.xinitrc</code>:</p>
<pre><code>...
exec Qt_tese
</code></pre>
<p><strong>缺点:非自动启动,而是手动输入<code>startx</code>命令启动.</strong></p>
</div>
<div id="MySignature" role="contentinfo">
<div>作者:wsg1100</div>
<div>出处:http://www.cnblogs.com/wsg1100/</div>
<div>本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div><br><br>
来源:https://www.cnblogs.com/wsg1100/p/12913491.html
頁:
[1]