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发行版是支持它的才行。
参考资料:
openSUSE:How to write a systemd service