文章摘要:
本文主要描述了systemd服务的应用,从 CentOS 7.x 以后,Red Hat 系列的发行版开始采用systemd的服服务管理模式,该模式支持并行启动,可以加快系统的启动速度。

操作系统: raspbian/debian
硬件平台: 树莓派


服务分类:

.service

一般服务类型,最常见的类型,主要是系统服务,包括服务器本身所需要的本地服务以及网络服务都是,比较经常被使用到的服务大多是这种类型。

.socket

内部程序数据交换的插槽(socket)服务,主要是 IPC (Inter-process communication) 的传输讯息插槽文件 (socket file) 功能。这种类型的服务通常在监控讯息传递的插槽文件,当有透过此插槽文件传递讯息来说要链接服务时,就依据当时的状态将该用户的要求传送到对应的服务,若服务尚未启动,则启动该服务后再传送用户的要求。
使用 socket 类型的服务一般是比较不会被经常用到的服务,因此在开机时通常会稍微延迟启动的时间 。一般用于本地服务比较多,例如我们的图形界面很多的软件都是透过 socket 来进行本机程序数据交换的行为。与早期的 xinetd 这个 super daemon 有部份的相似。

.target

执行环境类型:执行一系列的.service 或.socket 之类的服务的集合,例如 multi-user.target。

.mount
.automount

文件系统挂载相关的服务,文件系统的自动挂载等与文件系统相关性较高的程序管理。

.path

侦测特定文件或目录类型,某些服务需要侦测某些特定的目录来提供队列服务,例如最常见的打印服务,就是透过侦测打印队列目录来启动打印功能! 这时就得要 .path 的服务类型支持了!

.timer

循环执行的服务,有点类似 anacrontab 。


systemctl command 主要有:

start     : 立刻启动服务
stop      : 立刻关闭服务
restart   : 重启服务,相当于先start,再stop
reload    : 重载配置文件,让设定生效(不关闭服务)
enable    : 设定开机时自动启动
disable   : 取消开机时自动启动
status    : 显示服务状态,会列出有没有正在执行、开机预设执行否、登录等信息等
is-active : 显示服务是否正在运行
is-enabled: 显示是否设定了开机启动
mask      :注销服务
unmask    :取消注销状态

其他命令:
列出已安装的服务
systemctl list-unit-files



配置文件各字段说明:

[Unit]

Description

使用 systemctl list-units 时命令时,会输出给管理员看的简易说明,使用 systemctl status 输出的此服务的说明。

Documentation

帮助文档

After

说明此服务是在哪个服务启动之后才启动的,仅是说明服务启动的顺序而已,并没有强制要求。

Before

与 After 的意义相反,是在什么服务启动前最好启动这个服务。仅是规范服务启动的顺序并非强制要求。

Requires

明确的定义此服务需要在哪个服务进程启动后才能够启动,如果在此项设定的前导服务没有启动,那么该服务就不会被启动。

Wants

与 Requires 刚好相反,规范的是这个服务之后最好还要启动什么服务,但Wants后面接的服务如果没有启动,不会影响到这个 服务本身!

Conflicts

冲突的服务,项目后面接的服务如果有启动,那么服务就不能启动。


[Service]

Type

服务启动的方式,对ExecStart有影响

simple默认值,主要由 ExecStart 接的指令串来启动,启动后常驻于内存中。
forking由 ExecStart 启动的程序透过 spawns 延伸出其他子程序来作为主要服务。原生的父程序在启动结束后就会终止运作。 传统的 unit 服务大多属于这种项目,例如 httpd服务,当 httpd 的程序因为运作过久因此即将终结了,则 systemd 会再重新生出另一个子程序持续运作后,再将父程序删除。
oneshot与 simple 类似,不过在工作完毕后就结束了,不会常驻在内存中。
dbus与 simple 类似,必须要在取得一个 D-Bus 的名称后,才会继续运作,因此设定这个项目时,通常也要设定BusName。
idle与 simple 类似,必须要所有的工作都顺利执行完毕后才会执行。通常是开机到最后才执行即可的服务。

EnvironmentFile

指定启动脚本的环境配置文件,Environment后面可接多个不同的 Shell 变量来设定。

ExecStart

启动服务要执行的命令或脚本,可以使用 ExecStartPre (之前)以及 ExecStartPost (之后)两个设定项目来在实际启动服务前,进行额外的指令行为,指令串仅接受『指令 参数 参数...』的格式,不能接受 <, >, >>, |, & 等特殊字符。若要支持比较完整的 bash 语法需要指定Type=oneshot。

ExecStop

关闭服务时所进行的指令。

ExecReload

reload时执行的指令

Restart

Restart=1 时,服务终止后,会再次的启动此服务。

RemainAfterExit

RemainAfterExit=1 时,则当所属的所有程序都终止之后,此服务会再尝试启动。主要与Type=oneshot的服务配合。

TimeoutSec

服务在启动或者是关闭时,因为某些缘故导致无法顺利『正常启动或正常结束』的情况下,进行『强制结束』的超时时间,单位为(毫)秒。

KillMode

process - 服务终止时,只会终止 KillMode 主要的程序 (ExecStart 接的后面那串指令)
control-group - 由此服务所产生的其他control-group的程序,也都会被关闭。
none - 没有程序会被关闭。

RestartSec

服务被关闭后,再重新启动需经等待的时间 ,默认值为100(毫秒)。


[Install]

WantedBy

这个设定后面接的大部分是 *.target, 表示这个服务是附挂在哪一个target底下的,一般来说,大多的服务性质的服务都是附挂在 multi-user.target 底下。

Also

当服务被 enable时,Also 后面接的服务需要(手动)enable。

Alias

别名通过systemctl enable命令操作时,会建立一个别名的软链接。
例如multi-user.target的别名设定为default.target时,就会建立/etc/systemd/system/default.target指向/usr/lib/systemd/system/multi-user.target。


几个重要的目录

/etc/systemd/system - 基本上都是一些软连接,通过管理命令连接的,一般不要手动添加或者删除
/lib/systemd/system - 基本上都在这里了(新建,删除也在这里了)
/usr/lib/systemd/system - 使能的开机自启的服务(硬连接),调用enable/disable命令时创建/删除.


https://cloud.tencent.com/developer/article/1619565