在使用IPFS遇到一个问题,就是在服务器端启动了 ipfs daemon 命令后,关闭终端对应守护进程也会停止,但我并不想让他停止运行,所以就查到相关信息资料,如下分享:
当我们需要让IPFS一直在后台保持运行时,可以创建一个 ipfs.service 服务
基于 Linux 服务器创建一个服务。
cd /lib/systemd/system/
vim ipfs.service
粘贴以下代码让IPFS遇到故障后能自动重启服务。
[Unit]
Description=IPFS
[Service]
ExecStart=/usr/local/bin/ipfs daemon
Restart=always
User=root
Group=root
[Install]
WantedBy=multi-user.target
保存退出后执行命令
systemctl start ipfs
此时 ipfs 就在后台已经启动了,可以随意关闭窗口了
可以通过这个顺带学习一下 Linux 中 service 文件
这个脚本分为 3 个部分:[Unit] [Service] [Install]。
Unit
Unit 表明该服务的描述,类型描述。我们称之为一个单元。比较典型的情况是单元 A 要求在单元 B 启动之后再启动。这种设置是通过 Unit 下面的 Requires、After、Before、Wants 来调整的。比如上述场景的编写可以这样(在 A 中编写):
Requires=B
After=B
这段设置表明了 A 的启动依赖于 B,同时有要求在 B 启动之后启动自己。设置十分简介。需要注意的是,依赖关系通常用在服务(Service)而不是目标(Target)上。
Service
Service 是脚本的关键部分,这个字段主要给出服务的启动行为,如何启动、重启、停止。这一部分用于设置一些关键参数:
Type=forking: 后台运行模式
PIDFile=/xxx/xxx.xxx :存放 PID 文件的位置
ExecStart=/bin/echo xxx :这是服务运行的具体执行命令
ExecReload=/bin/echo xxx :这是服务重启的执行命令
EexcStop=/bin/echo xxx: 这是服务停止的执行命令
Service 的启动方式,在 Service 段中,启动方式使用 Type 指定。具体可以参考 man systemd.service。
值得注意的是,在脚本中关于服务启动、重启、关闭的指令需要使用绝对路径,否则会出现无法识别的情况。
当完成一个服务脚本后,我们就可以使用 systemctl start|stop|restart xxx.service 等指令了。若要开机启动这个服务我们使用如下的指令:
systemctl enable xxx.service
若要关闭开机启动:
systemctl disable xxx.service
当我们需要查看服务信息的使用可以使用如下指令:
systemctl list-units –type=service: 列出正在运行的服务
在 service 片段中有几个概念很重要,这直接影响到实践中创建自定义服务的最终结果。以下内容根据 linux 系统
中 man systemd.service 用户手册说明经过翻译和整理而得。
service 配置之 Type
首先是 Type 配置,在 service 片段中有 Type 的配置,这个配置给当前的服务单元用于设置进程的启动类型。
Type 有如下几种可选项:
simple
forking
oneshot
dbus
notify
idel
simple,这是默认的 Type,当 Type 和 BusName 配置都没有设置,指定了 ExecStart 设置后,simple 就是默认的 Type 设置。simple 使用 ExecStart 创建的进程作为服务的主进程。在此设置下 systemd 会立即启动服务,如果该服务要启动其他服务(simple 不会 forking),它们的通讯渠道应当在守护进程启动之前被安装好(e.g. sockets,通过 sockets 激活)。
forking,如果使用了这个 Type,则 ExecStart 的脚本启动后会调用 fork()函数创建一个进程作为其启动的一部分。当一切初始化完毕后,父进程会退出。子进程会继续作为主进程执行。这是传统 UNIX 主进程的行为。如果这个设置被指定,建议同时设置 PIDFile 选项来指定 pid 文件的路径,以便 systemd 能够识别主进程。
oneshot,onesh 的行为十分类似 simple,但是,在 systemd 启动之前,进程就会退出。这是一次性的行为。可能还需要设置 RemainAfterExit=yes,以便 systemd 认为 j 进程退出后仍然处于激活状态。
dbus,这个设置也和 simple 很相似,该配置期待或设置一个 name 值,通过设置 BusName=设置 name 即可。
notify,同样地,与 simple 相似的配置。顾名思义,该设置会在守护进程启动的时候发送推送消息(通过 sd_notify(3))给 systemd。
Service 其他配置节点
RemainAfterExit:默认值 no
默认值为 no,这个设置采用 booleean 值,可以是 0、no、off、1、yes、on 等值。它表明服务是否应当被视为激活的,即便当它所有的进程都退出了。简言之,这个设置用于告诉 systemd 服务是否应当是被视为激活状态,而不管进程是否退出。当为 true 时,即便服务退出,systemd 依然将这个服务视为激活状态,反之则服务停止。
GuessMainPID
采用 boolean 值指定 systemd 在无法确切的查明服务的时候是否需要猜测服务的 main pid。除非 Type=forking 被采用并且 PIDFile 没有被设置,否则这个选项会被忽略。因为当设置为 Type 的其他选项,或者显示的指定了 PID 文件后,systemd 总是能够知道 main pid。
PIDFile
采用一个绝对路径的文件名指定守护进程的 PID 文件。当 Type=forking 被设置的时候,建议采取这个设置。当服务启动后,systemd 会读取守护进程的主进程 id。systemd 不会对该文件写入数据。
BusName
使用一个 D-Bus 的总线名称,作为该服务的可访问名称。当 Type=dbus 的时候,该设置被强制使用。
BusPolicy
如果该选项被指定,一个自定义的 kdbus 终结点将会被创建,并且会被指定为默认的 dbus 节点安装到服务上。这样的自定义终结点自身持有一个策略规则集合。这些规则将会在总线范围内被强制指定。该选项只有在 kdbus 被激活时有效。
ExecStart
当服务启动的时候(systemctl start youservice.service),会执行这个选项的值,这个值一般是“ExecStart=指令 参数”的形式。当 Type=oneshot 的时候,只有一个指令可以并且必须给出。原因是 oneshot 只会被执行一次。
ExecStartPre、ExecStartPost
顾名思义,这两个设置的意义在于 ExecStart 被执行之前和之后被执行。
ExecReload
服务重启时执行。
ExecStop
服务停止时执行。
ExecStopPost
服务停止后执行。
Install
WantedBy 字段:表示该服务所在的 Target。
Target 的含义是服务组,表示一组服务。WantedBy=multi-user.target 指的是服务所在的 Target 是 multi-user.target
Systemd 有默认的启动 Target。就是 multi-user.target,在这个组里的所有服务,都将开机启动。
查看 multi-user.target 包含的所有服务
systemctl list-dependencies multi-user.target
参考链接:
置于服务脚本编写,借鉴了 https://blog.csdn.net/guiziwen/article/details/80291702
脚本理解原文链接 https://www.jianshu.com/p/92208194d700