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应用程序。
- 安装openbox:
sudo apt-get install openbox
配置登录管理器lightdm自动登录
在
/etc/lightdm/lightdm.conf
中指定autologin-session
使用openbox
窗口管理器:[Seat:*]
autologin-user=work
autologin-session=openbox
在
/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显示服务。
执行xinit
和startx
时,它们将寻找~/.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脚本,运行startx
和xinit
执行~/.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
命令启动.
ubuntu下图形程序自启动的几种方法的更多相关文章
- ubuntu下设置环境变量的三种方法【转】
转自:http://blog.chinaunix.net/uid-26916352-id-3208366.html 通常设置环境变量有三种方法: 一.临时设置 export PATH=/home/ya ...
- Ubuntu下设置服务自启动
Ubuntu下设置服务自启动 一般/etc下可能还有/etc/rc.local,/etc/rc.sysinit文件,一般/etc/rc.local默认并不做什么实事,可能是系统留下的一个接口,供用户添 ...
- Ubuntu下定时任务和自启动任务的部署
1.定时任务的部署,最简单的方法是执行 crontab -e 然后在下面加上世间周期配置和要执行的命令,一般情况下,可以把要执行的任务用bash脚本封装一下,格式如下所示: minute hour ...
- ubuntu下将程序挂后台命令
ubuntu下将程序挂后台命令 nohup python -u main.py > test.out 2>&1 & ubunut下查看后台进程 jobs -l
- ubuntu下C程序的编辑、编译、运行
均以hello world程序为例 一.vim hello.c/hello.cpp 创建hello.c/hello.cpp文件,并进入vim界面 二.此时按键盘上的很多键均不会有任何反应,键入i,进入 ...
- 改善C#程序,提高程序运行效率的50种方法
改善C#程序,提高程序运行效率的50种方法 转自:http://blog.sina.com.cn/s/blog_6f7a7fb501017p8a.html 一.用属性代替可访问的字段 1..NET ...
- Linux下查看线程数的几种方法汇总
Linux下查看线程数的几种方法汇总 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Linux下查看某个进程的线程数量 pstree命令以树状图显示进程间的关系(display ...
- windows下获取IP地址的两种方法
windows下获取IP地址的两种方法: 一种可以获取IPv4和IPv6,但是需要WSAStartup: 一种只能取到IPv4,但是不需要WSAStartup: 如下: 方法一:(可以获取IPv4和I ...
- Linux下查看磁盘挂载的几种方法
Linux下查看磁盘挂载的几种方法 第一种方法:df命令 # df -hT Filesystem Type Size Used Avail Use% Mounted on devtmpfs devtm ...
随机推荐
- 4、flink自定义source、sink
一.Source 代码地址:https://gitee.com/nltxwz_xxd/abc_bigdata 1.1.flink内置数据源 1.基于文件 env.readTextFile(" ...
- 0day学习笔记(2)--函数调用
函数调用过程 调用函数操作 函数参数入栈(在当前函数栈帧),从左至右或从右至左视情况而定 一般为从右至左 mov 地址,参数 的一个操作并不直接pop而是定位到地址将参数传递进去 call offse ...
- PHP如何实现判断提交的是什么方式
function get_request_method() { // $_SERVER包含了诸多头信息.路径.以及脚本位置等等信息的数组,这个数组中的项目有web服务器创建. if (isset($_ ...
- urlencode()和rawurlencode()区别
urlencode和rawurlencode两个方法在处理字母数字,特殊符号,中文的时候结果都是一样的 ,唯一的不同是对空格的处理, urlencode处理成“+”, rawurlencod ...
- python学习21之高级特性
'''''''''1.切片(1)谁可以进行切片操作?——列表,元组,字符串(2)切片有以下几种操作'''#[a:b]:取从下标为a的元素开始,到下标为b-1的元素结束L=['aa','bb','cc' ...
- Data Flow Diagram with Examples - Customer Service System
Data Flow Diagram with Examples - Customer Service System Data Flow Diagram (DFD) provides a visual ...
- Libra教程之:执行Transactions
文章目录 Transactions是什么 Transactions运行的基础条件 Transactions的结构 执行Transactions Transactions是什么 我们讲到了Libra是一 ...
- eggjs解决跨域问题
Egg.js 是什么? Egg.js 为企业级框架和应用而生,我们希望由 Egg.js 孕育出更多上层框架,帮助开发团队和开发人员降低开发和维护成本. Egg.js特性 提供基于 Egg 定制上层框架 ...
- Mbatis逆向工程常遇错误
org.apache.ibatis.exceptions.PersistenceException: ### Error building SqlSession.### The error may e ...
- strip()的正则表达式版本
题目:写一个函数,它接受一个字符串,做的事情和 strip()字符串方法一样.如果只 传入了要去除的字符串,没有其他参数,那么就从该字符串首尾去除空白字符. 否则,函数第二个参数指定的字符将从该字符串 ...