服务是常驻在内存中的程序,通常用于提供系统或网络功能,用于启动service的二进制文件称为daemon
在Unix的system V版本中,启动服务的管理方式被称为SysV的init脚本程序处理方式,即系统核心第一个调用的程序为init,再由init调用其他服务
所有服务启动脚本放置于 /etc/init.d
init 根据用户的执行等级来调用不同的服务,从而进入不同的操作界面,等级为0-6,其启动脚本放置在 /etc/rc[0-6].d,连接到/init.d的daemon

命令 init [num] 可切换执行等级,其会自动启动 rc[0-6].d 的脚本
根据上面,可知只要在 /etc/rc[0-6].d 下放置链接文件即可完成开机启动,也可使用如下命令
systemd将daemon统称为服务unit,每种服务依据功能区分为不同type
| 后缀名 | 功能 |
|---|---|
| .service | 系统服务 |
| .socket | 用于IPC(Inter-process communication)的传输信息,一般用于唤醒其他服务 |
| .target | 用于执行一群服务的集合 |
| .mount / .automount | 挂载相关服务 |
| .path | 检查特定文件的服务,如打印服务 |
| .timer | 循环执行的服务 |
命令 systemctl [command] service用于统一管理服务
如下 atd.service 状态enable表示可开机自启,状态active(running)表示正在运行

如下,先关闭cup.service(该服务用于打印)

然后启动cup.socket

输出文字test用于打印,可看到cup.service被唤醒

服务具有相连性,cups.service会通过port 631来实现打印,但系统无需一直启动631端口,故多了一个cup.socket服务,这个服务用于监听端口,在用户有需要打印时会主动唤醒cups.service
解决办法是将cup.socket和cups.service一同关闭,或使用命令 mask 将cups.service注销

如上,使用mask后,cups.service无法再启动,取消注销则为unmask
命令 systemctl 默认加参数 list-units 列出已启动的服务,–all列出未启动的服务,list-unit-files 依据/usr/lib/systemd/system的文件进行解释,–type列出指定类型服务

systemd取消了原来执行等级的概念,转为使用不同的target操作环境
命令 get-default 获取当前target,set-default设置默认target,isolate切换模式

命令 list-depencies即可列出当前服务的所使用的服务

如上可看到graphical.target用到multi-user.target,如下反向查找被哪些其他服务用到

可通过man systemd.service查看更具体介绍

Unit说明服务用途和相关性等:
Service说明服务启动脚本、环境等:
| 参数 | 说明 |
|---|---|
| Type | simple:ExecStart指令启动并常驻内存 forking:由fork启动 oneshot:ExecStart指令启动但只执行一次 |
| EnvironmentFile | 指定启动脚本的环境配置文件 |
| ExecStart | 启动服务的指令或脚本 |
| ExecStop | 关闭服务的指令或脚本 |
| ExecReload | reload的指令或脚本 |
| Restart | 为1时服务停止后会再次启动,如tty登出后会再启动tty用于登入 |
| TimeoutSec | 服务无法正常启动或关闭时,等待多久进入强制结束状态 |
| RestartSec | 服务重启时间 |
Install说明服务的target等:
新建脚本backup.sh用于打包/etc

在/etc/systemd/system下新建back.service

接下来启动back.service,状态为inactive,因为脚本执行完并不会常驻内存,可看到生成了压缩包

systemctl的timer也可实现定时执行的功能,可在/etc/systemd/system 下自定义 *.timer
| 参数 | 意义 |
|---|---|
| OnActiveSec | timers.targer启动多久后执行 |
| OnBootSec | 开机多久后执行 |
| OnStartupSec | systemd第一次启动多久后执行 |
| OnUnitActiveSec | 距离上一次启动多久后再执行 |
| OnUnitInactiveSec | 距离上一次停止多久后再执行 |
| OnCalendar | 使用实际时间启动,格式为week YYYY-MM-DD HH:MM:SS |
| Unit | 如果 .service和 .timer的名称不一样则需指定service |
| Persistent | 是否持续运行 |
现需要:

如下,只需要启动back.timer

如下

如果使用OnCalendar指定时间,则NextElapseUSecRealtime为距1970-01-01 00:00:00的时间