zoukankan      html  css  js  c++  java
  • 【原创】ubuntu下图形程序自启动的几种方法

    版权声明:本文为本文为博主原创文章,转载请注明出处。如有问题,欢迎指正。博客地址:https://www.cnblogs.com/wsg1100/
    @

    0.前言

    在嵌入式的场合通常会让Linux只执行某一个特定的人机交互应用程序,比如一个QT应用,本文讲述了在Ubuntu环境下如何配置应用自启动,希望对你有所帮助。

    1.带桌面环境的自动启动

    该方法由桌面去启动qt程序,这里说的桌面指窗口管理器如xface、gnome、kde等。

    1.1Ubuntu

    以Ubuntu 图形界面作为例子(这里使用Ubuntu16.04,基于gnome开发)如下:

    在当前用户home下创建autostart目录:

    mkdir -p ~/.config/autostart
    

    创建一个**.desktop的文件如下:

    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:
    sudo apt-get install openbox
    
    1. 配置登录管理器lightdm自动登录

    2. /etc/lightdm/lightdm.conf中指定autologin-session使用openbox窗口管理器:

      [Seat:*]
      autologin-user=work
      autologin-session=openbox
      
    3. /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:

    $ 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.

    menu.xml
    openbox-session 启动时调用。它包含了在 Openbox 上下文中定义的变量。任何你想对 Openbox 本身可见以及从菜单启动的程序需要的变量都放在这里。

    让Openbox作为一个单独的窗口管理器运行,把以下内容加入~/.xinitrc:

    exec openbox-session
    

    如果想在命令行下启动 Openbox , 用 xinit :

    $ 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应用程序。这里还需要设置登录管理器自动登录配置,达到自动启动目的。
    **

    登录管理器与用户会话相关的配置文件/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 来找到。

    查看当前系统启动了哪些会话窗口:

    loginctl
    

    2.3 xorg

    X.Org 项目提供了 X 窗口系统的开源实现。开发工作是在freedesktop.org 社区的通力合作下完成。X.Org 组织是非盈利教育机构。Xorg 在 Linux 中非常流行,已经成为linux图形用户程序的必备条件,所以大部分发行版都提供了它.

    用户通常需要选择安装某个 窗口管理器桌面环境以配合使用 X。

    2.3.1 xinit(startx)

    如果不用登陆管理器启动 X显示服务,可以使用xinit手动启动Xorg显示服务。

    执行xinitstartx时,它们将寻找~/.xinitrc作为shell脚本运行以启动客户端程序。

    如果~/.xinitrc不存在,startx将运行默认值/etc/X11/xinit/xinitrc(默认的xinitrc启动一个Twm,xorg-xclock和Xterm环境),ubuntu安装后的/etc/X11/xinit/xinitrc文件如下:

    #!/bin/bash
    . /etc/X11/Xsession
    

    2.3.2 xserverrc

    xserverrc 文件是负责启动X服务器的shell脚本,运行startxxinit执行~/.xserverrc,如果~/.xserverrc不存在startx会用/etc/X11/xinit/xserverrc,内容如下:

    #!/bin/sh
    exec /usr/bin/X -nolisten tcp "$@"
    

    启动X11, -nolisten tcp 禁用X11的抽象套接字。
    要运行Xorg,直接执行:

    $startx
    

    如果配置了xserverrrc:

    $xinit -- :1
    

    注意:当另一个X服务器已经启动时,xinit不处理多个显示。对于必须通过附加指定显示,这里是以上。-- :display_number display_number 1

    要退出X,直接运行窗口管理器的退出功能,如果没有窗口管理器,执行:

    $ pkill -15 Xorg
    

    pkill将终止所有正在运行的X实例,要专门终止当前虚拟终端上的窗口管理器:

    $ pkill -15 -t tty“$ XDG_VTNR”Xorg
    

    2.3.3没有窗口管理器启动应用程序

    可以在没有窗口管理器的情况下仅启动特定应用程序,尽管这很可能仅适用于以全屏模式显示的单个应用程序。例如~/.xinitrc:

    ...
    exec Qt_tese
    

    缺点:非自动启动,而是手动输入startx命令启动.

  • 相关阅读:
    git常用指令 github版本回退 reset
    三门问题 概率论
    如何高效的学习高等数学
    数据库6 关系代数(relational algebra) 函数依赖(functional dependency)
    数据库5 索引 动态哈希(Dynamic Hashing)
    数据库4 3层结构(Three Level Architecture) DBA DML DDL DCL DQL
    梦想开始的地方
    java String字符串转对象实体类
    java 生成图片验证码
    java 对象之间相同属性进行赋值
  • 原文地址:https://www.cnblogs.com/wsg1100/p/12913491.html
Copyright © 2011-2022 走看看