编写.service文件

注:本文适用于systemd用户,其他init可能有些出入比如你用的是openRC或SysVinit等,具体参见其官方文档。

什么是.service文件?

Linux中.service文件是某项服务对应的配置文件,可用于systemd管理和控制的服务的设置。

.service 文件通常包含3个模块,即[Unit]控制单元,表示启动顺序和依赖关系;[Service]服务,表示服务的定义;[Install]安装,表示如何安装配置文件。

也许大家经常要用到这些指令:systemctl enable xxx,systemctl start xxx,等等。xxx便可以是.service文件。

enable xxx.service意为开机自启该项服务,disable xxx.service意为取消开机自启该项服务,stop意为停止该项服务,start意为启动该项服务。当然可以不以root身份执行,而加一个–user,组成:systemctl --user start xxx,即以用户身份去启动。

现在我们要写一个.service,命名为pulseaudiostart.service,它将执行pulseaudio --start指令:

[Unit]
Description=Start pulseaudio   # 服务描述

[Service]
Type=simple                    # 服务启动的模式  
ExecStart=/usr/bin/pulseaudio --start         # 启动进程时执行的命令
ExecStop=/usr/bin/pulseaudio --kill           # 停止服务时执行的命令
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target                    # 表示该服务所在的 Target。

然后放在什么地方呢?下面这张图片也许可以作为参考:

serviceaddress

系统服务可以放在:/usr/lib/systemd/system/ , 用户服务可以放在:/usr/lib/systemd/user/ (具体看上图)
但不建议管理员直接往上面提到的这两个地方放。给管理员用的可以是/etc/systemd/system和/etc/systemd/user
一般来说,对于那些支持systemd的软件,安装的时候,会自动在/usr/lib/systemd/system目录添加一个配置文件,但是也有例外,比如我的gentoo默认是在/lib/systemd/system/
如图:
example1
example2
example3
当然也可以放在~/.config/systemd/user/

然后我们可以执行systemctl --user start pulseaudiostart.service来开启此服务。


现在,我们对.service文件做更多的解释:
对于[Service]中的Type字段,它定义的是启动类型,它可以设置的值如下:
simple(默认值):ExecStart字段启动的进程为主进程
forking:ExecStart字段将以fork()方式启动,此时父进程将会退出,子进程将成为主进程
oneshot:类似于simple,但只执行一次,Systemd 会等它执行完,才启动其他服务
dbus:类似于simple,但会等待 D-Bus 信号后启动
notify:类似于simple,启动结束后会发出通知信号,然后 Systemd 再启动其他服务
idle:类似于simple,但是要等到其他任务都执行完,才会启动该服务。一种使用场合是为让该服务的输出,不与其他服务的输出相混合


[Unit] 区块中可以设置After字段和Before字段,After字段表示应该在哪些服务之后启动,Before字段表示应该在哪些服务之前启动。
比如After=network.target sshd-keygen.service表示如果network.target或sshd-keygen.service需要启动,那么指定的服务应该在它们启动之后启动。
设置依赖关系,需要使用Wants字段和Requires字段。
Wants字段:表示该服务与Wants指定服务之间存在"弱依赖"关系,即如果Wants指定服务启动失败或停止运行,不影响该服务继续执行。
Requires字段则表示"强依赖"关系,即如果其指定服务启动失败或异常退出,那么该服务也必须退出。


[Service] 区块中,除ExecStart字段和ExecStop字段外,还有:
ExecReload字段:重启服务时执行的命令
ExecStartPre字段:启动服务之前执行的命令
ExecStartPost字段:启动服务之后执行的命令
ExecStopPost字段:停止服务之后执行的命令

KillMode字段:定义 Systemd 如何停止服务。
KillMode字段可以设置的值如下:
control-group(默认值):当前控制组里面的所有子进程,都会被杀掉
process:只杀主进程
mixed:主进程将收到 SIGTERM 信号,子进程收到 SIGKILL 信号
none:没有进程会被杀掉,只是执行服务的 stop 命令。

Restart字段:定义了进程退出后,Systemd 的重启方式。
no(默认值):退出后不会重启
on-success:只有正常退出时(退出状态码为0),才会重启
on-failure:非正常退出时(退出状态码非0),包括被信号终止和超时,才会重启
on-abnormal:只有被信号终止和超时,才会重启
on-abort:只有在收到没有捕捉到的信号终止时,才会重启
on-watchdog:超时退出,才会重启
always:不管是什么退出原因,总是重启

RestartSec字段:表示 Systemd 重启进程之前,需要等待的秒数。
RemainAfterExit字段:设置RemainAfterExit=yes使得 systemd 在服务进程退出之后仍然认为服务处于激活状态。


[Install] 区块定义如何安装这个配置文件

WantedBy字段:表示该服务所在的 Target。
Target的含义是服务组,表示一组服务。
WantedBy=multi-user.target指的是,该服务所在的 Target 是multi-user.target。systemd默认的启动 Target 是multi-user.target。在这个组里的所有服务,都将开机启动。

关于Target,详情参见:
https://www.freedesktop.org/software/systemd/man/bootup.html#System%20Manager%20Bootup


参考文章:http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html

https://wiki.archlinux.org/title/Systemd

还有诸多参与讨论的群友们,在此一并表示感谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值