systemd不仅仅只要service一个类型,还有其他类型,例如: sockettargettimer等等,可是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

创立systemd service装备文件

将装备文件挪到/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

创立systemd service装备文件

从头加载装备

# systemctl daemon-reload

从头检查nginx的状况

# /etc/systemd/system/nginx.service

创立systemd service装备文件

通过上面的事例能够剖析得出,当/usr/lib/systemd/system//etc/systemd/system/都存在装备文件的时分,是以/etc/systemd/system/为准。

软件晋级导致/usr/lib/systemd/system/装备文件被重置,这儿将不做演示。

service 装备结构

service装备组成部分

systemd一切的单元装备文件均有如下三个部分组成:

  • Unitsystemd单元的基本元数据,如描绘、文档指定依靠关系等。

  • 单元类型: 这儿根据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 该装备界说发动单位的顺序,装备的单元将在本单元后发动。

这儿提及一下,RequiresWants 以及 BeforeAfter 的差异,前两者表明依靠关系,后两者表明发动顺序。

Service装备描绘

关键字 描绘
Type 该装备为进程发动的类型。
ExecStart 该装备表明在发动该单元要履行的指令或许脚本
ExecStop 该装备表明在中止时需求履行的指令或许脚本。
ExecReload 该装备表明在从头载入单元的时分需求履行的指令或许脚本。
Restart 该装备表明进程在反常退出后,会被从头发动。
KillSignal 该装备表明体系要中止或许从头发动服时,使用指定的信号来通知进程,默许信号为SIGTERM

除此之外,不仅有ExecStart,还能装备数条ExecStartPre,该装备表述在发动之前应当履行的指令或许脚本,可是ExecStart仅有一条;除此之外,还有ExecStopPreExecReloadPre 以此类推。

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检查状况的时分,会显示出来,例如:

创立systemd service装备文件

  • After表明在发动nginx后,要发动network-online.targetremote-fs.targetnss-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而言,应当至少包括发动指令或许脚本等。