systemd 
- 启动系统时并行启动
- 按需激活systemd管理的服务
- 服务快照
- 服务依赖定义
unit 
配置文件 
每个unit都有一个配置文件,告诉systemd怎么启动这个服务单元。系统启动时,systemd会读取/etc/systemd/system 下的unit配置,即开机启动,其他配置目录在开启开机启动时,会创建一个符号链接在/etc/systemd/system中。
| 目录 | 作用 | 
|---|---|
| /etc/systemd/system | 开机启动的服务单元配置 | 
| /run/systemd/system | 运行时的服务单元配置,一般很少修改 | 
| /lib/systemd/system | 本地的服务单元配置 | 
| /usr/lib/systemd/system | 第三方软件安装的服务单元配置 | 
单元类型 
| 类型名称 | 作用 | 
|---|---|
| .service | 封装守护进程的启动、停止、重启和重载操作,是最常见的一种 unit 类型 | 
| .target | 用于对 unit 进行逻辑分组,引导其他 unit 的执行。 | 
| .device | 对应 /dev目录下设备,主要用于定义设备之间的依赖关系 | 
| .mount | 定义系统结构层次中的一个挂载点,可以替代过去的 /etc/fstab 配置文件 | 
| .automount | 用于控制自动挂载文件系统。自动挂载即当某一目录被访问时系统自动挂载该目录,这类unit取代了传统Linux系统的autofs相应功能 | 
| .path | 用于监控指定目录变化,并触发其他unit运行 | 
| .scope | 这类 unit 文件不是用户创建的,而是 Systemd 运行时自己产生的,描述一些系统服务的分组信息 | 
| .slice | 用于描述 cgroup 的一些信息,极少使用到 | 
| .snapshot | 这种 unit 其实是 systemctl snapshot 命令创建的一个描述 Systemd unit 运行状态的快照 | 
| .socket | 监控系统或互联网中的 socket 消息,用于实现基于网络数据自动触发服务启动 | 
| .swap | 定义一个用于做虚拟内存的交换分区 | 
| .timer | 封装由system的里面由时间触发的动作, 替代了 crontab 的功能 | 
service配置 
service配置包含三个部分Unit、Service、Install ,字段表格中加粗的字段均可以多次出现配置,参考
Unit段 
区块通常是配置文件的第一个区块,用来定义 Unit 的元数据,以及配置与其他 Unit 的关系。它的主要字段如下。
| 字段 | 描述 | 
|---|---|
| Description | 服务描述 | 
| Documentation | 文档地址 | 
| Wants | 当前服务需要其他unit配合,若其他unit未启动,不会启动失败 | 
| Requires | 当前服务依赖的其他unit,依赖的unit停止或重启,当前服务也会停止或重启 | 
| Requisite | 与Requires类似,若依赖的unit未启动,当前服务会立刻停止 | 
| BindsTo | 与其他单元绑定,若其他unit停止,当前服务也会停止 | 
| PartOf | 与Requires类似,若依赖单元重启或停止,当前服务也重启或停止 | 
| Upholds | 与Wants类似,会持续重启依赖unit | 
| Conflicts | 当前服务不能与给定的unit同时运行 | 
| Before | 当前服务必须在给定的unit之前启动 | 
| After | 当前服务必须在给定的unit之后启动 | 
| Condition* | 当前服务必须满足给定条件,否则不运行 | 
| Assert* | 当前服务必须满足给定条件,否则启动失败 | 
Service段 
service块配置,记录服务信息,环境变量、启动方式、工作目录等
| 字段 | 描述 | 
|---|---|
| Type | 进程类型(参见下方类型介绍) | 
| ExecStart | 启动命令 | 
| ExecStartPre | 启动前置命令 | 
| ExecStartPost | 启动后置命令 | 
| ExecReload | 重启命令 | 
| ExecStop | 停止命令 | 
| ExecStopPost | 停止后置命令 | 
| RestartSec | 自动重启当前服务间隔的秒数 | 
| Restart | 定义何种情况 Systemd 会自动重启当前服务 | 
| TimeoutSec | 定义 Systemd 停止当前服务之前等待的秒数 | 
| Environment | 环境变量 | 
| EnvironmentFile | 指定加载一个包含服务所需的环境变量列表的文件,文件中的每一行都是一个环境变量的定义 | 
| Nice | 服务的进程优先级,值越小优先级越高,默认为0。-20为最高优先级,19为最低优先级。 | 
| WorkingDirectory | 工作目录 | 
| RootDirectory | 指定服务进程的根目录( / 目录),如果配置了这个参数后,服务将无法访问指定目录以外的任何文件。 | 
| User | 指定运行服务的用户,会影响服务对本地文件系统的访问权限。 | 
| Group | 指定运行服务的用户组,会影响服务对本地文件系统的访问权限。 | 
| LimitCPU | cpu资源限定 | 
| LimitSTACK | 程序堆栈限定 | 
| LimitNOFILE | 文件句柄数量限定 | 
| LimitNPROC | 子进程数量限定 | 
进程类型(Type)可选值
- simple 即使二进制或者用户不存在启动会返回成功
- exec 若二进制不存在或用户不存在启动会返回失败
- forking 将ExecStart作为作为子进程执行,服务启动成功后主进程退出
- oneshot 在主进程退出后启动服务单元
- dbus 设置BusName或类型指定,总线释放,服务管理会尝试终止服务
- notify 类似exec,在服务启动后发送通知消息
- idle 类似simple,服务程序的实际执行会延迟
服务重启(Restart)可选值
- no 不重启
- always 所有异常情况都重启
- on-success 仅当退出码或者退出信号正常时
- on-failure 不满足on-success的其他异常情况
- on-abnormal 非正常的退出信号、服务超时、看门狗超时
- on-abort 非正常的退出信号
- on-watchdog 看门狗超时
Install段 
用来定义如何启动,以及是否开机启动。
| 字段 | 描述 | 
|---|---|
| Alias | 额外别名unit | 
| WantedBy | 它的值是一个或多个 Target,当前 Unit 激活时(enable)符号链接会放入/etc/systemd/system目录下面以 Target 名 + .wants后缀构成的子目录中 | 
| RequiredBy | 它的值是一个或多个 Target,当前 Unit 激活时,符号链接会放入/etc/systemd/system目录下面以 Target 名 + .required后缀构成的子目录中 | 
| Also | 当前 Unit 激活(enable)时,会被同时激活的其他 Unit | 
常用命令 
| 用途 | 命令 | 
|---|---|
| 启动服务 | systemctl start 服务名[.service] | 
| 停止服务 | systemctl stop 服务名[.service] | 
| 服务状态 | systemctl status 服务名[.service] | 
| 重启服务 | systemctl restart 服务名[.service] | 
| 设置服务开机启动 | systemctl enable 服务名[.service] | 
| 禁止服务开机启动 | systemctl disable 服务名[.service] | 
| 禁用服务 | systemctl mask 服务名[.service] | 
| 启用服务 | systemctl unmask 服务名[.service] | 
| 查看运行的服务 | systemctl list-units | 
| 查看所有开机启动服务 | systemctl list-unit-files | 
| 查看服务依赖 | systemctl list-dependencies 服务名[.service] | 
| 重新加载服务配置 | systemctl daemon-reload | 
| 查看服务日志 | journalctl -u 服务名[.service] | 
