systemd 包含一系列工具集合,其作用不仅包含初始化操作系统,还包括后台服务管理,日志归档,设备管理,电源管理、定时任务等

systemd 将不同的资源统称为 Unit (单元) ,Unit 配置文件按照约定,放在指定的系统目录下

  • /etc/systemd/system      系统或用户自定义的配置文件
  • /run/systemd/system      软件运行时生成的配置文件
  • /usr/lib/systemd/system     系统或第三方软件安装时添加的配置文件。

目录有优先级之分,按照上面的顺序优先级依次递减,当三个目录中有同名文件时,优先级较高的目录里的文件会被优先使用使用

Unit文件格式

systemd 服务的 Unit 文件可以分三个段

  • Unit
  • Service
  • Install

以下是ssh.service

$ cat /usr/lib/systemd/system/ssh.service 
[Unit]
Description=OpenBSD Secure Shell server
Documentation=man:sshd(8) man:sshd_config(5)
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
RuntimeDirectory=sshd
RuntimeDirectoryMode=0755

[Install]
WantedBy=multi-user.target
Alias=sshd.service

Unit

Unit 段用于定义 Unit 以及 Unit 的依赖关系,主要的配置属性有以下几个:

属性名 说明
Description 描述这个 Unit 文件的信息
Documentation 指定服务的文档,可以是一个或多个文档的 URL 路径
Requires 依赖的其它 Unit 列表,列在其中的 Unit 会在这个Unit启动时的同时被启动,如果其中任意一个Unit启动失败,这个Unit也会启动失败。
Wants 与 Requires 相似,但只是在当前 Unit 启动时,触发启动列出的 Unit ,而不考虑这些 Unit 启动是否成功
After 与 Requires 相似,但是在后面列出的所有 Unit 全部启动后,才会启动当前的 Unit
Before 与 After 相反,当前 Unit 应该在列出的 Unit 之前启动
OnFailure Unit 启动失败时,自动启动列出的每个 Unit
Conflicts 与这个 Unit 有冲突的模块,如果列出的 Unit 已经在运行时,当前 Unit 不能启动,反之亦然

Service

Service 段用于定义服务型(以.service结尾) Unit 的启动行为,主要的配置属性有以下几个:

属性名 说明
EnvironmentFile 指定当前服务的环境变量定义文件,该文件内部的 key=value 键值对,可以用 $key 的形式,在当前.service文件中引用
ExecStart 定义启动进程时执行的命令
ExecStartPre 启动当前服务之前执行的命令
ExecStartPost 启动当前服务之后执行的命令
ExecStop 停止服务时执行的命令
ExecStopPost 停止服务之后执行的命令
ExecReload 重启服务时执行的命令
Type 启动类型,取值见下表 启动类型
WorkingDirectory 指定服务的工作目录
RootDirectory 指定服务进程的根目录,如果配置了这个参数,服务将无法访问指定目录以外的文件
User 指定运行服务的用户
Group 指定运行服务的用户组
KillMode 定义 Systemd 如何停止服务,取值见下表 KillMode

所有的启动属性之前,都可以加上一个减号(-),表示 “抑制错误” ,即发生错误的时候,不影响其他命令的执行。

启动类型

类型 说明
simple 默认值,执行ExecStart指定的命令,启动主进程
forking 以 fork 方式从父进程创建子进程,创建后父进程会立即退出
oneshot 一次性进程,Systemd 会等当前服务退出,再继续往下执行
dbus 当前服务通过D-Bus启动
notify 当前服务启动完毕,会通知Systemd,再继续往下执行
idle 若有其他任务执行完毕,当前服务才会运行

KillMode

类型 说明
control-group 默认值,当前控制组里面的所有子进程,都会被杀掉
process 只杀主进程
mixed 主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none 没有进程会被杀掉,只是执行服务的 stop 命令。

Install

Install 段用于定义如何安装这个配置文件,使 Unit 在系统启动时自动运行,主要的配置属性有以下几个:

属性名 说明
WantedBy 值为一个或多个 Target,当前 Unit 激活 (enable) 时符号链接会放入 /usr/lib/systemd/system 目录下以 <Target>.wants 后缀构成的子目录中
Also 当前 Unit enable/disable 时,同时 enable/disable 的其他 Unit
Alias 当前 Unit 可用于启动的别名