linux设置开机自动启动应用,可屏蔽桌面

本篇适合有需求将某些应用或者服务甚至是QT应用设置成开机启动的玩家,提供三种添加开机自启方式,亲测有用!!!

一、往/etc/rc.local中添加执行脚本

第一种是最简单也是最基本的方式,将需要开机自启的UI或者应用添加写成脚本的形式,放置在固定的位置;然后将该脚本的绝对路径添加到/etc/rc.local中。
linux设置开机自动启动应用,可屏蔽桌面_第1张图片
这种方式可能比较简易,但是存在一个弊端,如果你需要开机启动一个QT的界面应用的话,这种方式会在启动之后会先显示一下桌面,然后在进入UI界面
但是可以通过ctrl+alt+F7切换回桌面,满足任意时刻切换到桌面进行调试的要求;同时可以通过ctrl+alt+F1~6切换回ui界面,一般是F1即可

二、往systemd中添加开机自启服务

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。在老版本的Linux上移植使用init进程来启动服务,而init进行的启动方式是串行启动,只有前一个进程启动完成后才会进行下一个进程的启动,所以较systemd低,所以systemd诞生后就取代了init.
linux设置开机自动启动应用,可屏蔽桌面_第2张图片
Systemd 并不是一个命令,而是一组命令,涉及到系统管理的方方面面。
具体使用方式,可以看我的另一篇博文systemd服务分析

2.1 创建服务文件,编写systemd启动unit

每一个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;

2.1.1 [Unit]:启动顺序和依赖关系

  • Unit区块的Description字段给出当前服务的简单描述,Documentation字段给出文档位置;
  • After字段:表示如果network.targetsshd-keygen.service需要启动,那么sshd.service应该在它们之后启动;
  • Before字段,定义sshd.service应该在哪些服务之前启动;
  • After和Before字段只涉及启动顺序,不涉及依赖关系;
  • Wants字段:表示sshd.servicesshd-keygen.service之间存在"弱依赖"关系,即如果"sshd-keygen.service"启动失败或停止运行,不影响sshd.service继续执行;
  • Requires字段则表示"强依赖"关系,即如果该服务启动失败或异常退出,那么sshd.service也必须退出;
  • Wants字段与Requires字段只涉及依赖关系,与启动顺序无关,默认情况下是同时启动的。

2.1.2 [Service]:启动行为,定义如何启动当前服务

  • EnvironmentFile字段:指定当前服务的环境参数文件。该文件内部的key=value键值对,可以用$key的形式,在当前配置文件中获取;
  • ExecStart字段:定义启动进程时执行的命;
  • ExecReload字段:重启服务时执行的命令;
  • ExecStop字段:停止服务时执行的命令;
  • ExecStartPre字段:启动服务之前执行的命令;
  • ExecStartPost字段:启动服务之后执行的命令;
  • ExecStopPost字段:停止服务之后执行的命令;
  • Type字段定义启动类型。它可以设置的值如下;
    • simple(默认值):ExecStart字段启动的进程为主进程;
    • forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程;
    • oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务;
    • dbus:类似于simple,但会等待 D-Bus 信号后启动;
    • notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务;
    • idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合;
  • KillMode字段:定义Systemd如何停止sshd服务;
    • control-group(默认值):当前控制组里面的所有子进程,都会被杀掉;
    • process:只杀主进程;
    • mixed:主进程将收到SIGTERM信号,子进程收到SIGKILL信号;
    • none:没有进程会被杀掉,只是执行服务的stop命令;
  • Restart字段:定义了sshd退出后,Systemd的重启方式;
    • no(默认值):退出后不会重启;
    • on-success:只有正常退出时(退出状态码为0),才会重启;
    • on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启;
    • on-abnormal:只有被信号终止和超时,才会重启;
    • on-abort:只有在收到没有捕捉到的信号终止时,才会重启;
    • on-watchdog:超时退出,才会重启;
    • always:不管是什么退出原因,总是重启;
  • RestartSec字段:表示 Systemd 重启服务之前,需要等待的秒数。上面的例子设为等待42秒;

2.1.3 [Install]:定义如何安装这个配置文件,即怎样做到开机启动

  • 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

2.2 创建服务文件

通过前面的分析,应该可以很清楚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服务分析

2.3 添加到自启服务

完成前面的配置后,需要将该服务添加到自启服务中去,才可以实现开机自启。

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文件就在该文件下面,仿造它原来的启动文件配置自己的配置文件再进行启动更改即可;

3.1 .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
  • 第4行,可执行文件的绝对路径,该KEY是必选的;

3.2 添加到启动项

完成到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填入即可;

你可能感兴趣的:(Linux杂项,linux)