systemd不仅仅只有service一个类型,还有其他类型,例如: socket、target、timer等等,但是service无疑是最最重要的一个,所以本篇文章将介绍service配置文件。
systemd unit配置文件路径
配置目录说明
systemd配置文件,有2个路径,分别是:
/usr/lib/systemd/system
该目录包含系统安装的软件所提供的systemd配置单元文件,一般情况下,该文件均有软件包所属,管理员不应该直接修改此文件,若后续对包进行升级都有可能替换掉这些文件,
/etc/systemd/system
该目录存放管理员定义的systemd单元文件,管理员可以在此目录下定义systemd单元文件,若该目录下的文件和/usr/lib/systemd/system目录下的文件名称一致,则以该目录下配置为准,因为操作系统会优先读取该目录下的配置。
配置优先级例子
这里举个例子。
操作步骤:首先使用systemctl status查看nginx的状态,并且将其loaded的配置单元文件挪到/etc/systemd/system/nginx.service下,再重载下配置文件,并且重新查看nginx的状态。
查看nginx状态:
arduino
# systemctl status nginx

将配置文件挪到/etc/systemd/system/下
shell
# cp -a /usr/lib/systemd/system/nginx.service /etc/systemd/system/
# ls -l /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx.service

重新加载配置
arduino
# systemctl daemon-reload
重新查看nginx的状态
shell
# /etc/systemd/system/nginx.service

通过上面的案例可以分析得出,当/usr/lib/systemd/system/和 /etc/systemd/system/都存在配置文件的时候,是以/etc/systemd/system/为准。
软件升级导致/usr/lib/systemd/system/配置文件被重置,这里将不做演示。
service 配置结构
service配置组成部分
systemd所有的单元配置文件均有如下三个部分组成:
-
Unit:systemd单元的基本元数据,如描述、文档指定依赖关系等。 -
单元类型: 这里根据
systemd单元类型的不同,配置也相应的不同,例如:service单元应当配置[Service],而socket单元应当配置Socket等。 -
Install: 定义单元的安装和启动配置。
如Service类型所定义的配置文件应当为:
ini
[Unit]
;; 描述Unit、指定依赖关系等
[Service]
;; Service 详细配置,如,启动、停止命令,启动方式等。
[Install]
;; 定义Service安装和启动配置
除此之外,systemd还允许加载额外的配置文件,以nginx.service为例,处理在/etc/systemd/system/nginx.service外,还将从/etc/systemd/system/nginx.service.d/*.conf下读取配置,配合格式和上述一致。
service配置具体含义
Unit配置描述
| 关键字 | 描述 |
|---|---|
Description |
该配置为单元概述,该内容会记录到systemctl status输出中。 |
Documentation |
该配置为单元帮助文档,参数以空格分割的URL列表,引用单元或配置的文档。有固定的类型格式。 |
Requires |
该配置为配置单元的依赖关系,如果依赖的单元无法启动,则该单位就无法激活。 |
Wants |
该配置为单元的依赖关系,比Requires还要弱的配置,如果依赖的单元无法启动,则该单位也可以正常启动。 |
Before |
该配置定义启动单位的顺序,配置的单元将在本单元前启动。 |
After |
该配置定义启动单位的顺序,配置的单元将在本单元后启动。 |
这里提及一下,Requires 和 Wants 以及 Before 和 After 的区别,前两者表示依赖关系,后两者表示启动顺序。
Service配置描述
| 关键字 | 描述 |
|---|---|
Type |
该配置为进程启动的类型。 |
ExecStart |
该配置表示在启动该单元要执行的命令或者脚本。 |
ExecStop |
该配置表示在停止时需要执行的命令或者脚本。 |
ExecReload |
该配置表示在重新载入单元的时候需要执行的命令或者脚本。 |
Restart |
该配置表示进程在异常退出后,会被重新启动。 |
KillSignal |
该配置表示系统要停止或者重新启动服时,使用指定的信号来通知进程,默认信号为SIGTERM。 |
除此之外,不仅有ExecStart,还能配置数条ExecStartPre,该配置表述在启动之前应当执行的命令或者脚本,但是ExecStart仅有一条;除此之外,还有ExecStopPre、ExecReloadPre 以此类推。
Install配置描述
| 关键字 | 描述 |
|---|---|
Alias |
该配置表示为该单元提供别名,除systemctl enable外,其余均可使用别名控制。 |
WantedBy |
该配置表示当设置该单元开机自启后,期望于放入哪个target下。 |
RequiredBy |
该配置表示该单元在何种target下被启动。 |
Also |
该配置表示引入一个额外的配置项。 |
分析nginx.service配置文件
这里先分析一下nginx.service文件,如果想要自定义该文件,建议先复制到/etc/systemd/system/下,具体配置信息为:
ini
# cp -a /usr/lib/systemd/system/nginx.service /etc/systemd/system/
# cat /etc/systemd/system/nginx.service
[Unit]
Description=The nginx HTTP and reverse proxy server
After=network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target
[Service]
Type=forking
PIDFile=/run/nginx.pid
# Nginx will fail to start if /run/nginx.pid already exists but has the wrong
# SELinux context. This might happen when running `nginx -t` from the cmdline.
# https://bugzilla.redhat.com/show_bug.cgi?id=1268621
ExecStartPre=/usr/bin/rm -f /run/nginx.pid
ExecStartPre=/usr/sbin/nginx -t
ExecStart=/usr/sbin/nginx
ExecReload=/usr/sbin/nginx -s reload
KillSignal=SIGQUIT
TimeoutStopSec=5
KillMode=process
PrivateTmp=true
[Install]
WantedBy=multi-user.target
#
上述配置中,
[Unit]表示该配置单元的概述:
Description是简介,在使用systemctl status查看状态的时候,会显示出来,例如:

After表示在启动nginx后,要启动network-online.target、remote-fs.target、nss-lookup.target等单元。Wants表示在启动nginx之前要启动想要的依赖,这里是network-online.target,当然即使启动不成功,也会正常启动nginx的。
[Service]表示服务本身配置
Type表示启动的方式,这里是fork一个新的进程来启动PIDFile表示定义的pid路径ExecStartPre表示在启动服务前执行的动作,这里将删除此前的pid,命令为:/usr/bin/rm -f /run/nginx.pid,而后又是ExecStartPre,该参数可以多次出现,执行的命令为:/usr/sbin/nginx -tExecStart表示启动服务执行的命令,命令为:/usr/sbin/nginxExecReload表示执行systemctl reload执行的命令,该命令为/usr/sbin/nginx -s reloadKillSignal表示执行systemctl stop的时候,向进程发出的信号,SIGQUIT的信号值为:3TimeoutStopSec表示停止最大时间为5秒KillMode表示杀掉的类型为进程PrivateTmp表示启动服务的时候启动临时文件系统处理
Install表示服务的安装和启动配置
WantedBy表示当使用systemctl enable的时候,期望将此服务放置到multi-user.target中
总结
在创建systemd配置单元时,可以往2个目录写配置文件,分别是:/usr/lib/systemd/system/和 /etc/systemd/system/,如果是自定义的单元,那么往哪个目录放都可以,如果是修改目前已有的配置文件,建议复制/usr/lib/systemd/system/到/etc/systemd/system/进行修改,避免因为软件升级等因素,导致配置文件修改内容丢失。
systemd所有的单元配置文件均有3个部分组成,分别是Unit、具体的类型、Install,其中对于Service而言,应当至少包含启动命令或者脚本等。