XDG Autostart 规范定义了一种在桌面环境启动和可移动介质安装时自动启动desktop 的方法,该方法就是将它们放在特定的Directories中。所以对于有界面的程序的自启动,可以利用linux的desktop文件来实现,通过将创建好的desktop文件复制到~/.config/autostart目录下,实现有界面程序的自启动。
注意:
特定于用户的:$XDG_CONFIG_HOME/autostart(~/.config/autostart默认情况下)
全系统:$XDG_CONFIG_DIRS/autostart(/etc/xdg/autostart默认情况下)
1. 并不是放在目录下就一定会生效,会话管理器还会去读取desktop中autostart的字段:
X-GNOME-Autostart:true表示开机需要自启动,false应用程序将从列表中删除;
2. X-GNOME-Autostart-Phase :控制应用程序的启动阶段(默认为“Applications”阶段)
会话管理器将分5个阶段启动:
Initialization:底层的程序,需要很早运行起来的
WindowManager:包括窗口管理器和合成管理器,以及在映射任何窗口之前必须运行的任何其他内容
Panel:包括永久占用屏幕不动的任何内容
Desktop:包括在桌面上绘制的任何东西
Applications:是其他一切
crontab [选项]
选项:
-e: 编辑crontab定时任务
-l: 查询crontab任务
-r: 删除当前用户所有的crontab任务
@reboot /bin/bash/脚本路径和脚本名称
备注: 创建完的定时任务会存到/var/spool/cron/ 里面,这个目录下会有依据用户名产生登录表;
systemd 是 Linux 操作系统的系统和服务管理器,注意全部是小写,systemd是init和SystemV的替代者。当作为启动时的第一个进程(作为 PID 1)运行时,它充当启动和维护用户空间服务的初始化系统。为登录用户启动单独的实例以启动他们的服务。
init/systemdV |
systemd |
|
启动时间 |
启动时间长。init 进程是串行启动,只有前一个进程启动完,才会启动下一个进程。 |
更多的并行启动,意味着如果我们必须运行某些东西,我们不应该序列化它的启动(就像 sysvinit 那样),而是同时运行它,这样可用的 CPU 和磁盘 IO 带宽就会被最大化,并且因此,整体启动时间最小化。 |
启动脚本 |
启动脚本复杂。init进程只是执行启动脚本,不管其他事情。脚本需要自己处理各种情况,这往往使得脚本变得很长。 |
对服务本身进行管理; 少启动——启动较少的服务或者推迟启动,直到真正需要它们的时候,才启动。只要没有人想联系你的机器,就不需要运行它,只要它在第一次连接时启动。 例如,除非实际插入了蓝牙加密狗或应用程序想要与其 D-Bus 接口通信,否则不需要运行 bluetoothd。 |
systemd是目前Linux系统上主要的系统守护进程管理工具,systemd所管理的所有系统资源都称作Unit,通过systemd命令集可以方便的对这些Unit进行管理。比如systemctl、hostnamectl、timedatectl、localctl等命令。
systemd 有一个最小的事务系统:如果一个单元被请求启动或关闭,它将把它和它的所有依赖项添加到一个临时事务中。然后,它会验证交易是否一致(即所有单元的排序是否无循环)。如果不是,systemd 将尝试修复它,并从事务中删除可能循环的非必要作业。此外,systemd 会尝试抑制事务中会停止正在运行的服务的非必要作业。最后检查事务的作业是否与已经排队的作业相矛盾,然后可选地中止事务。如果一切都解决了并且事务是一致的并且其影响最小化,它将与所有已经完成的作业合并并添加到运行队列中。
命令名称 |
说明 |
systemctl |
用于检查和控制各种系统服务和资源的状态; |
journalctl |
用于查看系统日志和各类应用服务日志; |
systemd-notify |
Systemd 的内部工具,用于通知服务的状态变化; |
systemd-analyze |
显示此次系统启动时运行每个服务所消耗的时间,可以用于分析系统启动过程中的性能瓶颈; |
systemd-cgls |
递归地显示指定 CGroup 的继承链; |
systemd-cgtop |
显示系统当前最耗资源的 CGroup 单元; |
loginctl |
用于管理系统已登录用户和 Session 的信息; |
systemd-nspawn |
用于创建 Systemd 容器; |
命令 |
说明 |
$ systemctl --version |
查看systemd的版本 |
$ systemctl status |
显示系统状态 |
$ sysystemctl status 服务名.service |
查看某个服务的状态 |
$ sudo systemctl start 服务名.service |
启动某个服务 注意是root权限 |
$ sudo systemctl stop 服务名.service |
停止某个服务 |
$ sudo systemctl restart 服务名.service |
重启某个服务 |
systemctl daemon-reload |
重新加载服务的配置文件 |
systemd中这些资源分别代表着不同的单元(Unit)。systemd 总共有 11 种不同类型的“单元”。单元封装了与系统启动和维护相关的各种对象。systemd通过这些Unit的配置文件,知道怎么启动这些Unit。
提供以下单位类型:
1.服务单元(systemd.service):启动和控制守护进程及其组成的进程。
2.套接字单元(systemd.socket):它封装了系统中的本地 IPC 或网络套接字,对于基于套接字的激活很有用。
3.目标单元(systemd.target):可用于对单元进行分组,或在启动期间提供众所周知的同步点。
4.设备单元(systemd.device):在 systemd 中公开内核设备,并可用于实现基于设备的激活。
5.挂载单元(systemd.mount):控制文件系统中的挂载点。
6.自动挂载单元(systemd.automount):提供自动挂载功能,用于按需挂载文件系统以及并行启动。
7.定时器单元(systemd.timer):对于触发基于定时器的其他单元的激活很有用。
8.交换单元(systemd.swap):与挂载单元非常相似,封装了操作系统的内存交换分区或文件。
9.路径单元(systemd.path):当文件系统对象更改或修改时,路径单元可用于激活其他服务。
10.切片单元(systemd.slice):可用于将管理系统进程的单元(例如服务和范围单元)分组到分层树中,以用于资源管理。
11.范围单元(systemd.scope):类似于服务单元,但管理外部进程而不是启动它们。
单元文件是从编译期间确定的一组路径加载的,如右表中所述。在前面列出的目录中找到的单元文件会覆盖列表中较低目录中的同名文件。
一个.Service配置文件分为三部分:
Unit:定义该服务作为Unit角色时相关的属性
Service:定义本服务相关的属性
Install:定义本服务在设置服务开机自启动时相关的属性。换句话说,只有在创建/移除服务配置文件的软链接时,Install段才会派上用场。这一配置段不是必须的,当未配置[Install]时,设置开机自启动或禁止开机自启动的操作将无任何效果
命令 |
说明 |
systemctl enable 服务名.service |
服务加入开机自启动 |
systemctl disable 服务名.service |
从开机自启动中删除服务 |
systemctl is-enabled 服务名.service |
查看是否设置了开机自启动 |
systemctl list-unit-files --type service | grep 'enabled' |
查看所有开机自启动的服务 |
备注:
unit文件官方文档
以下 图片来自于systemd时代的开机启动流程(GPT+systemd) - Systemd系列文章 侵删
如果要让任务开机自启动,需将对应的Unit文件存放于/etc/systemd/system下,下面是以service为例进行的流程介绍:
内核启动过程中流程图
内核引导结束流程图
当内核启动到内核空间中的根文件系统的时候,对于使用systemd的系统来说,这个时候就可以调用初始化文件中的systemd程序,其PID=1。从现在开始,systemd进程可以在此时做一些内核启动剩余的必要操作。
对于已经启动完成的正常系统来说,sysinit.target是用于做系统初始化的,basic.target则是系统初始化完成后执行的一些基本任务,比如启动所有定时器任务,开始监控指定文件等,算是系统启动过程中早期的开机自启动任务。