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状况:
# systemctl status nginx
将装备文件挪到/etc/systemd/system/下
# cp -a /usr/lib/systemd/system/nginx.service /etc/systemd/system/
# ls -l /usr/lib/systemd/system/nginx.service /etc/systemd/system/nginx.service
从头加载装备
# systemctl daemon-reload
从头检查nginx的状况
# /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类型所界说的装备文件应当为:
[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/下,详细装备信息为:
# 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的信号值为:3 -
TimeoutStopSec表明中止最大时间为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而言,应当至少包括发动指令或许脚本等。




