systemd的 Unit 配置

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 之前启动
OnFailureUnit 启动失败时,自动启动列出的每个 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 可用于启动的别名