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

原文链接:https://blog.csdn.net/qq_41714908/article/details/123141656

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

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

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

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

Systemd 是 Linux 系统工具,用来启动守护进程,已成为大多数发行版的标准配置。在老版本的Linux上移植使用init进程来启动服务,而init进行的启动方式是串行启动,只有前一个进程启动完成后才会进行下一个进程的启动,所以较systemd低,所以systemd诞生后就取代了init。
在这里插入图片描述
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应该在哪些服务之前启动; AfterBefore字段只涉及启动顺序,不涉及依赖关系;
  • 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

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类型是否必须
TypeApplication (type1), Link (type2), Direcory (type3)stringYes
Version版本,例如1.1stringNo
Name应用程序的特定名称,例如“Mozilla”。localestringYes
GenericName应用程序的通用名称,例如“Web浏览器”。localestringNo
NoDisplay不在菜单中显示, 但可以与MIME类型相关联booleanNo
Comment应用描述localestringNo
Icon要么绝对路径,要么符合图标主题规范localestringNo
Hidden是否隐藏,等同于不存在的文件booleanNo
OnlyShowIn, NotShowIn一般不用此字段booleanNo
DBusActivatableDBus激活,默认false。参阅D-Bus激活。应包含Exec行,实现兼容booleanNo
TryExec如果文件不存在, 则忽略该文件,并不在菜单中出现stringNo
Exec执行路径 。参阅Exec KeystringNo
Path当Type=Application时,程序运行的目录stringNo
Terminal程序是否在终端窗口中运行。booleanNo
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等)。参阅启动通知协议规范booleanNo
StartupWMClass一般跟Name相同即可stringNo
URL只适用于Type=LinkstringYes

直接复制原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填入即可;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值