如何配需要的Systemd服务
systemd的配置文件
Systemd 默认从目录/etc/systemd/system/读取配置文件。但是,里面存放的大部分文件都是符号链接,指向目录/usr/lib/systemd/system/,真正的配置文件存放在那个目录。
里面都一个个.service文件,对应的就是配置某个服务的systemd
配置文件的内容格式
[Unit]Description=<服务描述>After=<在哪个模块(服务)之后启动(可选)>[Service]Type=<simple|forking|oneshot>ExecStart=<程序或命令参数># 如果 "ExecStart=" 后面的程序或命令是在前台持续运行的,那么 "Type=" 后面应填写 "simple"。# 如果 "ExecStart=" 后面的程序或命令是在后台持续运行的,那么 "Type=" 后面应填写 "forking"。# 如果 "ExecStart=" 后面的程序或命令是在前台运行一下就退出的,那么 "Type=" 后面应填写 "oneshot"。ExecReload=<重新读取配置文件的命令(可选)>KillSignal=SIGTERMKillMode=mixed[Install]WantedBy=multi-user.target
主要分为三个部分,Unit Service Install, 注意KV,等号两边不要有空格,修改了配置文件之后需要执行
systemctl daemon-reload # 重载配置文件
Unit
在systemd中,一般一个服务就是一个Unit
一个Target 包含了一组Unit,启动一个Target相当于启动一组Unit服务,这也意味着系统至于了某个Target对应的状态点(可以简单类比做git的打target标签)
- Description:代表整个单元的描述,可根据需要任意填写。
- Wants:本单元启动了,它“想要”的单元也会被启动。但是这个单元若启动不成功,对本单元没有影响。
- Requires: 这个单元启动了,那么它“需要”的单元也会被启动; 它“需要”的单元被停止了,它自己也活不了。但是请注意,这个设定并不能控制启动顺序,因为它“需要”的单元启动也需要时间,若它“需要”的单元启动还未完成,就开始启动本单元,则本单元也无法启动,所以不建议使用这个字段。
- OnFailure:若本单元启动失败了,那么启动这个单元作为折衷。
- Before/After:指定启动顺序。
使用的时候注意 Wants Requires Before After之间的区别,要理解服务启动的前后顺序,以及级联关系,是否会影响自身或者依赖的服务
Service
- Type:服务的类型,各种类型的区别如下所示
- simple:默认,这是最简单的服务类型。意思就是说启动的程序就是主体程序,这个程序要是退出那么一切皆休。
- forking:标准 Unix Daemon 使用的启动方式。启动程序后会调用 fork() 函数,把必要的通信频道都设置好之后父进程退出,留下守护精灵的子进程。
- oneshot:适用于那些被一次性执行的任务或者命令,它运行完成后便了无痕迹。因为这类服务运行完就没有任何痕迹,我们经常会需要使用 RemainAfterExit=yes。意思是说,即使没有进程存在,Systemd 也认为该服务启动成功了。同时只有这种类型支持多条命令,命令之间用;分割,如需换行可以用\。
- dbus:这个程序启动时需要获取一块 DBus 空间,所以需要和 BusName= 一起用。只有它成功获得了 DBus 空间,依赖它的程序才会被启动。
- ExecStart:在输入的命令是start时候执行的命令,这里的命令启动的程序必须使用绝对路径,比如你必须用/sbin/arp而不能简单的以环境变量直接使用arp。
- ExecStartPre:启动当前服务之前执行的命令
- ExecStartPost:启动当前服务之后执行的命令
- ExecStop:在输入的命令是stop时候执行的命令,要求同上。
ExecReload:这个不是必需,如果不写则你的service就不支持restart命令。ExecStart和ExecStop是必须要有的
Install
服务编写完之后还需要被systemd装载,定义安装单元各个字段如下:
WantedBy:设置服务被谁装载,一般设置为multi-user.target
- Alias:为service设置一个别名,可以使用多个名字来操作服务。
- Also:在安装这个服务时候还需要的其他服务
