如何编写一个SystemdService(转)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

如何编写⼀个SystemdService(转)
转⾃
0x01 什么是Systemd Service
Systemd 服务是⼀种以 .service 结尾的单元(unit)配置⽂件,⽤于控制由Systemd 控制或监视的进程。

简单说,⽤于后台以守护精灵(daemon)的形式运⾏程序。

Systemd ⼴泛应⽤于新版本的RHEL、SUSE Linux Enterprise、CentOS、Fedora和openSUSE中,⽤于替代旧有的服务管理器service。

基本命令:
systemctl command xxx.service
# 其中command可以是start、stop、restart、enable等,⽐如:
systemctl start httpd.service #启动Apache服务
systemctl stop httpd.service #停⽌Apache服务
systemctl restart httpd.service #停⽌Apache服务
systemctl enable mariadb.service #将MariaDB服务设为开机启动
0x02 Systemd Service 存放的位置
Systemd Service 位于/etc/systemd/system(供系统管理员和⽤户使⽤),/usr/lib/systemd/system(供发⾏版打包者使⽤),我们⼀般使⽤前者即可。

0x03 编写Systemd Service
Systemd 服务的内容主要分为三个部分,控制单元(unit)的定义、服务(service)的定义、以及安装部分。

1. 定义控制单元 [Unit]
在 Systemd 中,所有引导过程中 Systemd 要控制的东西都是⼀个单元。

基本的⽤法如下:
Description:代表整个单元的描述,可根据需要任意填写。

Wants:本单元启动了,它“想要”的单元也会被启动。

但是这个单元若启动不成功,对本单元没有影响。

Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停⽌了,它⾃⼰也活不了。

但是请注意,这个设定并不能控制启动顺序,因为它“需要”的单元启动也需要时间,若它“需要”的单元启动还未完成,就开始启动本单元,则本单元也⽆法启动,所以不建议使⽤这个字段。

OnFailure:若本单元启动失败了,那么启动这个单元作为折衷。

Before/After:指定启动顺序。

看⼀个实际的例⼦:
[Unit]
Description=Protect ARP list
Wants=network-online.target
After=network.target
其中network.target代表有⽹路,network-online.target代表⼀个连通着的⽹络。

2. 定义服务本体 [service]
在定义完了 Systemd ⽤来识别服务的单元后,我们来定义服务本体。

基本的⽤法如下:
Type:服务的类型,各种类型的区别如下所⽰
simple:默认,这是最简单的服务类型。

意思就是说启动的程序就是主体程序,这个程序要是退出那么⼀切皆休。

forking:标准 Unix Daemon 使⽤的启动⽅式。

启动程序后会调⽤ fork() 函数,把必要的通信频道都设置好之后⽗进程退出,留下守护精灵的⼦进程。

oneshot:适⽤于那些被⼀次性执⾏的任务或者命令,它运⾏完成后便了⽆痕迹。

因为这类服务运⾏完就没有任何痕迹,我们经常会需要使⽤ RemainAfterExit=yes。

意思是说,即使没有进程存在,Systemd 也认为该服务启动成功了。

同时只有这种类型⽀持多条命令,命令之间⽤;分割,如需换⾏可以⽤\。

dbus:这个程序启动时需要获取⼀块 DBus 空间,所以需要和 BusName= ⼀起⽤。

只有它成功获得了 DBus 空间,依赖它的程序才会被启动。

ExecStart:在输⼊的命令是start时候执⾏的命令,这⾥的命令启动的程序必须使⽤绝对路径,⽐如你必须⽤/sbin/arp⽽不能简单的以环境变量直接使⽤arp。

ExecStop:在输⼊的命令是stop时候执⾏的命令,要求同上。

ExecReload:这个不是必需,如果不写则你的service就不⽀持restart命令。

ExecStart和ExecStop是必须要有的。

看⼀个实际的例⼦:
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/arp -f /etc/ip-mac
ExecReload=/sbin/arp -f /etc/ip-mac
ExecStop=/sbin/arp -d -a
这⾥在start和restart的时候会读取并添加/etc/ip-mac⽂件中的ARP条⽬到ARP表中,⽽stop时清空ARP表。

3. 安装服务 [install]
服务编写完之后还需要被systemd装载,定义安装单元各个字段如下:
WantedBy:设置服务被谁装载,⼀般设置为multi-user.target
Alias:为service设置⼀个别名,可以使⽤多个名字来操作服务。

Also:在安装这个服务时候还需要的其他服务
4.完整的 Systemd Service 配置实例
组合上⾯的三个模块,我们可以得到⼀个完整的 Systemd Service 配置实例:
[Unit]
Description=Protect ARP list
Wants=network-online.target
After=network.target
[Service]
Type=oneshot
RemainAfterExit=yes
ExecStart=/sbin/arp -f /etc/ip-mac
ExecReload=/sbin/arp -f /etc/ip-mac
ExecStop=/sbin/arp -d -a
[Install]
WantedBy=multi-user.target
0x04 总结
Systemd Service 是⼀种替代/etc/init.d/下脚本的更好⽅式,它可以灵活的控制你什么时候要启动服务,⼀般情况下也不会造成系统⽆法启动进⼊紧急模式。

所以如果想设置⼀些开机启动的东西,可以试着写 Systemd Service。

当然了,前提是你使⽤的Linux发⾏版是⽀持它的才⾏。

参考资料:。

相关文档
最新文档