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 -t
ExecStart
表示启动服务执行的命令,命令为:/usr/sbin/nginx
ExecReload
表示执行systemctl reload
执行的命令,该命令为/usr/sbin/nginx -s reload
KillSignal
表示执行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
而言,应当至少包含启动命令或者脚本等。