本篇适合有需求将某些应用或者服务甚至是QT应用设置成开机启动的玩家,提供三种添加开机自启方式,亲测有用!!!
第一种是最简单也是最基本的方式,将需要开机自启的UI或者应用添加写成脚本的形式,放置在固定的位置;然后将该脚本的绝对路径添加到/etc/rc.local中。
这种方式可能比较简易,但是存在一个弊端,如果你需要开机启动一个QT的界面应用的话,这种方式会在启动之后会先显示一下桌面,然后在进入UI界面
但是可以通过ctrl+alt+F7切换回桌面,满足任意时刻切换到桌面进行调试的要求;同时可以通过ctrl+alt+F1~6切换回ui界面,一般是F1即可
Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。在老版本的Linux上移植使用init进程来启动服务,而init进行的启动方式是串行启动,只有前一个进程启动完成后才会进行下一个进程的启动,所以较systemd低,所以systemd诞生后就取代了init.
Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。
具体使用方式,可以看我的另一篇博文systemd服务分析
每一个Unit都有一个配置文件,告诉Systemd怎么启动这个 Unit。Systemd默认从目录/etc/systemd/system/
读取配置文件;
读懂配置文件
一个服务需要怎么启动,完全由它的配置文件决定的,systemd的服务文件后缀为.service
,保存的文件路径在/etc/systemd/system
下(一共有三个地方存放服务文件==具体使用方式,可以看我的另一篇博文systemd服务分析==);
随便打开一个服务文件,比如sshd.service
文件为例,其用于启动SSH服务,具体如下:
[Unit]
Description=OpenBSD Secure Shell server
After=network.target auditd.service
ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
[Service]
EnvironmentFile=-/etc/default/ssh
ExecStartPre=/usr/sbin/sshd -t
ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
ExecReload=/usr/sbin/sshd -t
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
RestartPreventExitStatus=255
Type=notify
[Install]
WantedBy=multi-user.target
Alias=sshd.service
不难看出上面代码块一共包含三个区块,每个驱动下都有不同的key-value;
Unit
区块的Description
字段给出当前服务的简单描述,Documentation
字段给出文档位置;After
字段:表示如果network.target
或sshd-keygen.service
需要启动,那么sshd.service
应该在它们之后启动;Before
字段,定义sshd.service
应该在哪些服务之前启动;Wants
字段:表示sshd.service
与sshd-keygen.service
之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响sshd.service
继续执行;Requires
字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service
也必须退出;EnvironmentFile
字段:指定当前服务的环境参数文件。该文件内部的key=value
键值对,可以用$key
的形式,在当前配置文件中获取;ExecStart
字段:定义启动进程时执行的命;ExecReload
字段:重启服务时执行的命令;ExecStop
字段:停止服务时执行的命令;ExecStartPre
字段:启动服务之前执行的命令;ExecStartPost
字段:启动服务之后执行的命令;ExecStopPost
字段:停止服务之后执行的命令;Type
字段定义启动类型。它可以设置的值如下;
ExecStart
字段启动的进程为主进程;ExecStart
字段将以fork()
方式启动,此时父进程将会退出,子进程将成为主进程;simple
,但只执行一次,Systemd 会等它执行完,才启动其他服务;simple
,但会等待 D-Bus 信号后启动;simple
,启动结束后会发出通知信号,然后 Systemd 再启动其他服务;simple
,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合;KillMode
字段:定义Systemd如何停止sshd服务;
Restart
字段:定义了sshd退出后,Systemd的重启方式;
RestartSec
字段:表示 Systemd 重启服务之前,需要等待的秒数。上面的例子设为等待42秒;WantedBy
字段:表示该服务所在的 Target;Target
的含义是服务组,表示一组服务。WantedBy=multi-user.target
指的是,sshd 所在的 Target 是multi-user.target
;这个设置非常重要,因为执行systemctl enable sshd.service
命令时,sshd.service
的一个符号链接,就会放在/etc/systemd/system
目录下面的multi-user.target.wants
子目录之中。
systemd的target
Systemd 目标 | 注释 |
---|---|
runlevel0.target, poweroff.target | 中断系统(halt) |
runlevel1.target, rescue.target | 单用户模式 |
runlevel2.target, runlevel4.target, multi-user.target | 用户自定义启动级别,通常识别为级别3。 |
runlevel3.target, multi-user.target | 多用户,无图形界面。用户可以通过终端或网络登录。 |
runlevel5.target, graphical.target | 多用户,图形界面。继承级别3的服务,并启动图形界面服务。 |
runlevel6.target, reboot.target | 重启 |
emergency.target | 急救模式(Emergency shell) |
Systemd默认的启动Target为multi-user.target,我们也可以通过指令去查看当前启动的target
$systemctl get-default
multi-user.target
结果表示当前的target下所有的服务都将在开机时启动;
一般来说,常用的 Target 有两个:一个是multi-user.target
,表示多用户命令行状态;另一个是graphical.target
,表示图形用户状态,它依赖于multi-user.target
。
通过前面的分析,应该可以很清楚systemd启动服务的配置文件的编写规则,我们可以直接复制或者编写一套自己的服务文件;
比如说你新建一个服务文件名为:myui.service
编辑单元如下:
[Unit]
Description=my ui service
[Service]
Type=simple
ExecStart=你的应用或者脚本存放的路径,用于启动的
ExecReload=你的应用或者脚本存放的路径,用于重启的(非必要)
ExecStop=你的应用或者脚本存放的路径,用于停止的(非必要)
Restart=on-failure
RestartSec=42s
KillMode=process
[Install]
WantedBy=multi-user.target
以上的配置如果还是不太理解,具体使用方式,可以看我的另一篇博文systemd服务分析
完成前面的配置后,需要将该服务添加到自启服务中去,才可以实现开机自启。
sudo systemctl daemon-reload
设置开机自启
sudo systemctl enable gree
设置自启动,实质上就是在/etc/systemd/system/multi-user.target.wants/
下添加服务文件的链接。
重启相关服务
sudo systemctl start gree.service
查看服务状态
sudo systemctl status gree.service
ubuntu使用的是显示管理器一般为:LightDM - 跨桌面显示管理器,可以使用任何工具包中编写的各种前端,当前开发机使用的Ubuntu16.04默认使用该管理器。
显示管理器也称登陆管理器,向用户显示登录屏幕,它们提供图形化登录并处理用户身份验证,当用户成功输入用户名和密码的有效组合时,会话开始。
大多数登录管理器会从/usr/share/xsessions/
读取可用的.desktop
文件,在安装各种窗口管理器时会在/usr/share/xsessions/
下生成对应的desktop文件,比如ubuntu自带的ubuntu.desktop
文件就在该文件下面,仿造它原来的启动文件配置自己的配置文件再进行启动更改即可;
原ubuntu.desktop配置如下:
[Desktop Entry]
Name=Ubuntu
Comment=This session logs you into Ubuntu
Exec=gnome-session --session=ubuntu
TryExec=unity
Icon=
Type=Application
DesktopNames=Unity
X-Ubuntu-Gettext-Domain=gnome-session-3.0
.desktop
涉及的语法规则如下:
Key | 描述 | Value 类型 | 是否必须? |
---|---|---|---|
Type | Application (type1), Link (type2), Direcory (type3) | string | Yes |
Version | 版本,例如1.1 | string | No |
Name | 应用程序的特定名称,例如“Mozilla”。 | localestring | Yes |
GenericName | 应用程序的通用名称,例如“Web浏览器”。 | localestring | No |
NoDisplay | 不在菜单中显示, 但可以与MIME类型相关联 | boolean | No |
Comment | 应用描述 | ocalestring | No |
Icon | 要么绝对路径,要么符合图标主题规范 | localestring | No |
Hidden | 是否隐藏,等同于不存在的文件 | boolean | No |
OnlyShowIn, NotShowIn | 一般不用此字段 | boolean | No |
DBusActivatable | DBus激活,默认false。参阅D-Bus激活。应包含Exec行,实现兼容 | boolean | No |
TryExec | 如果文件不存在, 则忽略该文件,并不在菜单中出现 | string | No |
Exec | 执行路径 。参阅Exec Key | string | No |
Path | 当Type=Application时,程序运行的目录 | string No | 1 |
Terminal | 程序是否在终端窗口中运行。 | boolean | No |
Actions | 为其他组提供接口,比如Action=Gallery;,那么其他组就为[Desktop Action Gallery] | string(s) | No |
MimeType | 此应用支持打开的类型,具体类型可以百度 | string(s) | No |
Categories | 参阅桌面菜单规范 | string(s) | No |
Implements | 默认情况下,桌面文件不实现任何接口。参阅接口 | string(s) | No |
Keywords | 用于搜索,不应该是Name或者为多余的值 GenericName。 | localestring(s) | No |
StartupNotify | 如果不存在,则合理的处理取决于实现(假设为false,使用StartupWMClass等)。参阅启动通知协议规范 | boolean | No |
StartupWMClass | 一般跟Name相同即可 | string | No |
URL | 只适用于Type=Link | string | Yes |
直接复制原ubuntu的桌面启动文件,更名为你指定的文件
sudo cp /usr/share/xsessions/ubuntu.desktop yourfile.desktop
删除不必要的key避免造成不必要的麻烦,如下:
[Desktop Entry]
Name=yourapp
Comment=This session xxxxxxx
Exec=/你的待执行的应用路径
Icon=
Type=Application
完成到3.1 .desktop配置已经可以满足手动去启动程序了,就类似一个图标,接下来需要设置为登陆管理器自动启动;
3、使用显示管理器启动提到ubuntu使用的是lightdm作为登陆管理器,所以我们需要设置该管理器进行自动启动,编辑lightdm
的配置文件/etc/lightdm/lightdm.conf
,如下:
[Seat:*]
autologin-guest=false
autologin-user=gree
autologin-user-timeout=0
#autologin-session=app
#autologin-session=xterm
#autologin-session=openbox
#autologin-session=ubuntu
autologin-session=yourfile // 这里的yourfile和yourfile.desktop相关
和shell脚本一样,使用#号进行注释,注释第8行,添加第9行;需要注意的有如下几点:
autologin-user
字段必须是该autologin 群组的一员才能在不输入密码的情况下自动登录;本文的gree属于autologin 群组;autologin-session
字段更改为3.1 .desktop配置中的yourfile.desktop
,保留yourfile填入即可;