Unit文件编写,编写服务脚本

时光总嘲笑我的痴心妄想 提交于 2019-12-06 16:45:39

Unit文件编写参考链接:

    https://www.freedesktop.org/software/systemd/man/systemd.service.html

  • Unit基础介绍

Unit文件可以从多个位置加载,常见位置如下(优先级 低—>高):

/usr/local/lib/systemd/system/  :软件包安装后的unit

/etc/systemd/system/ :系统管理员安装的unit

备注:

·systemd 单元名仅能包含 ASCII 字符,下划线和点号和有特殊意义的字符('@', '-')。其它字符需要用 C-style "\x2d" 替换。

·当 systemd 运行在用户模式下时,使用的加载路径是完全不同的。

·以 # 开头的注释可能也能用在 unit-files 中,但是只能在新行中使用,在systemd的参数后面使用行末注释,则 unit 将会启动失败。

查看加载的位置

# systemctl show --property=UnitPath

  • Unit中的依赖关系处理

    使用 systemd 时,可通过正确编写单元配置文件来解决其依赖关系。典型的情况是,单元 A 要求单元 B 在 A 启动之前运行。在此情况下,向单元 A 配置文件中的 [Unit] 段添加 Requires=B 和 After=B 即可。若此依赖关系是可选的,可添加 Wants=B 和 After=B 。请注意 Wants= 和 Requires= 并不意味着 After= ,即如果 After= 选项没有制定,这两个单元将被并行启动。

    依赖关系通常被用在服务(service)而不是目标(target)上。例如, network.target 一般会被某个配置网络接口的服务引入,所以,将自定义的单元排在该服务之后即可,因为 network.target 已经启动。

  • 组成部分

1.Unit部分

Unit部分

参数

参数说明

Description

使用 systemctl list-units 时,会输出给管理员看的简易说明!当然,使用 systemctl status 输出的此服务的说明,也是这个项目!

Documentation

提供给管理员查看的文档,多为帮助文档。

After

说明此 unit 是在哪个 daemon 启动之后才启动,基本上仅是说明服务启动的顺序而已,并没有强制要求配置的服务一定要启动后此 unit 才能启动。与 Requires 的设置是有差异。

Before

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

Requires

明确的定义此 unit 需要在哪个 daemon 启动后才能够启动!就是设置相依服务,如果在此项设置的前导服务没有启动,那么此 unit 就不会被启动。

Wants

与 Requires 刚好相反,配置启动unit 之后最好还要启动什么服务比较好,不过,并没有明确的规定,主要的目的是希望创建让使用者比较好操作的环境。 因此,这个 Wants 后面接的服务如果没有启动,不会影响到这个 unit 本身。

Conflicts

用于冲突性检查。如果此处配置的服务已经启动,那该unit就不能启动。该unit启动,此处配置的服务则不能启动。

备注:以mysqld服务为例:

# systemctl list-units | grep "MySQL Server"

2.Install部分

Install部分

参数

参数说明

WantedBy

这个设置后面接的大部分是 *.target unit !意思是,这个 unit 本身是附挂在哪一个 target unit 下面的!一般来说,大多的服务性质的 unit 都是附挂在 multi-user.target 下面!

Also

当目前这个 unit 本身被 enable 时,Also 后面接的 unit 也请 enable 的意思!也就是具有相依性的服务可以写在这里呢!

Alias

    进行一个链接的别名的意思!当 systemctl enable 相关的服务时,则此服务会进行链接文件的创建!以 multi-user.target 为例,这个家伙是用来作为默认操作环境 default.target 的规划, 因此当你设置用成 default.target 时,这个 /etc/systemd/system/default.target 就会链接到 /usr/lib/systemd/system/multi-user.target !

备注:对于总线可激活服务,不要在systemd服务文件中包含“[Install]”部分,而是在相应的DBus服务文件中使用SystemdService=选项,例如:

3.Service部分

Service部分

参数

参数说明

User

启动该服务的用户

Group

启动该服务的组

Type

说明这个 daemon 启动的方式,会影响到 ExecStart !一般来说,有下面几种类型 :

simple:默认值,这个 daemon 主要由 ExecStart 接的指令串来启动,启动后常驻于内存中。【systemd认为该服务将立即启动。服务进程不会 fork 。如果该服务要启动其他服务,不要使用此类型启动,除非该服务是socket 激活型。】

forking:由 ExecStart 启动的程序通过 spawns 延伸出其他子程序来作为此 daemon 的主要服务。原生的父程序在启动结束后就会终止运行。 传统的 unit 服务大多属于这种项目,例如 httpd 这个 WWW 服务,当 httpd 的程序因为运行过久因此即将终结了,则 systemd 会再重新生出另一个子程序持续运行后, 再将父程序删除。据说这样的性能比较好!【systemd认为当该服务进程fork,且父进程退出后服务启动成功。对于常规的守护进程(daemon),除非你确定此启动方式无法满足需求,使用此类型启动即可。使用此启动类型应同时指定 PIDFile=,以便 systemd 能够跟踪服务的主进程。】

oneshot:与 simple 类似,不过这个程序在工作完毕后就结束了,不会常驻在内存中。【这一选项适用于只执行一项任务、随后立即退出的服务。可能需要同时设置 RemainAfterExit=yes 使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。】

notify:与 Type=simple 相同,但约定服务会在就绪后向 systemd 发送一个信号。这一通知的实现由 libsystemd-daemon.so 提供。

dbus:与 simple 类似,但这个 daemon 必须要在取得一个 D-Bus 的名称后,才会继续运行!因此设置这个项目时,通常也要设置 BusName= 才行!【若以此方式启动,当指定的 BusName 出现在DBus系统总线上时,systemd认为服务就绪】

idle:与 simple 类似,意思是,要执行这个 daemon 必须要所有的工作都顺利执行完毕后才会执行。这类的 daemon 通常是开机到最后才执行即可的服务!【systemd会等待所有任务处理完成后,才开始执行 idle 类型的单元。其他行为与 Type=simple 类似。】

说明:比较重要的项目大概是 simple, forking 与 oneshot 了!毕竟很多服务需要子程序 (forking),而有更多的动作只需要在开机的时候执行一次(oneshot),例如文件系统的检查与挂载啊等等的。

更多解释:systemd.service(5)

PIDFile

获取指向服务的PID文件的路径。对于Type=forking的服务,建议使用此选项。指定的路径通常指向/run/下面的文件。需要制定一个绝对路径。

TimeoutSec

若这个服务在启动或者是关闭时,因为某些缘故导致无法顺利“正常启动或正常结束”的情况下,则需要等多久才进入“强制结束”的状态!

PermissionsStartOnly

仅能符合权限的进行启动。

ExecStartPre=, ExecStartPost=

分别在ExecStart=中的命令之前或之后执行的其他命令。语法与ExecStart=相同,不同之处是允许多个命令行,并且命令是一个接一个地连续执行的。

ExecStart

就是实际执行此 daemon 的指令或脚本程序。也可以使用 ExecStartPre (之前) 以及 ExecStartPost (之后) 两个设置项目来在实际启动服务前,进行额外的指令行为。 但是要特别注意的是,指令串仅接受“指令 参数 参数...”的格式,不能接受 <, >, >>, |, & 等特殊字符,很多的 bash 语法也不支持喔! 所以,要使用这些特殊的字符时,最好直接写入到指令脚本里面去!不过,上述的语法也不是完全不能用,亦即,若要支持比较完整的 bash 语法,要使用 Type=oneshot 才行! 其它的 Type 不能支持这些字符。

ExecStop

与 systemctl stop unit的执行有关,关闭此服务时所进行的指令。

ExecReload

与 systemctl reload unit 有关的指令行为

RemainAfterExit

当设置为 RemainAfterExit=1 时,则当这个 daemon 所属的所有程序都终止之后,此服务会再尝试启动。这对于 Type=oneshot 的服务很有帮助!

EnvironmentFile

可以指定启动脚本的环境配置文件!例如 sshd.service 的配置文件写入到 /etc/sysconfig/sshd 当中!也可以使用 Environment= 后面接多个不同的 Shell 变量来给予设置!

LimitNOFILE

 

Restart

当设置 Restart=1 时,则当此 daemon 服务终止后,会再次的启动此服务。

举例来说:如果在 tty2 使用文字界面登陆,操作完毕后登出,基本上,这个时候 tty2 就已经结束服务了。 但是你会看到屏幕又立刻产生一个新的 tty2 的登陆画面等待用户的登陆!那就是 Restart 的功能!除非使用 systemctl 强制将此服务关闭,否则这个服务会源源不绝的一直重复产生!

RestartPreventExitStatus

如果在RestartPreventExitStatus= 中指定了退出代码或信号,或者使用systemctl stop或等效操作停止服务,则服务将不会重新启动。此外,如果在RestartForceExitStatus= 中指定了退出代码或信号,服务将始终重新启动。

PrivateTmp

 

KillMode

可以是 process, control-group, none 的其中一种,如果是 process 则 daemon 终止时,只会终止主要的程序 (ExecStart 接的后面那串指令),如果是 control-group 时, 则由此 daemon 所产生的其他 control-group 的程序,也都会被关闭。如果是 none 的话,则没有程序会被关闭!

RestartSec

与 Restart 有点相关性,如果这个服务被关闭,然后需要重新启动时,大概要 sleep 多少时间再重新启动的意思。默认是 100ms (毫秒)。

常用:5000ms或5s

BusName

接受此服务可访问的D-Bus总线名称。对于Type=dbus的服务,此选项是必需的。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!