Linux 多进程服务配置 systemd
Linux 多进程服务配置 systemd
整个项目由多个进程共同运行,现在需要一个可靠的保活机制,以便能够在进程崩溃的时候能够快速把它拉起来。有什么想法呢?最直观的解决方案无非就是写个保活脚本,在后台一直运行,如果发现某进程被关闭了,那么由脚本拉起来,但是脚本它自己挂掉怎么办?(总不能使用脚本继续保活保活脚本套娃吧)。此外,另一个办法就是配置出来一个服务,让Linux
操作系统帮你守护进程,显然,这种办法完全不需要担心守护进程自己挂掉,毕竟是systemd
帮你守护,如果它挂掉了,操作系统应该也没了。
sysvinit和systemd
sysvinit
和systemd
分别是两个Linux
操作系统的初始化系统,Linux
操作系统的服务就是它们运行起来的。在centos7
之前使用的是sysvinit
,centos7
及之后使用的是systemd
。此外还有ubuntu
的UpStart
,不过新版的Ubuntu
也使用systemd
了。
比较明显的特征就是,旧版的linux
使用service httpd start
启动服务,新版的linux
使用systemctl start httpd
来启动服务,此外使用initd
作为初始化系统的操作系统添加服务是在/etc/init.d/
中添加脚本,而使用systemd
作为初始化系统的操作系统只需要在/etc/systemd/system/
文件夹中添加配置文件就好了。
具体和systemd
相关的介绍可以看这里:浅析init和systemd【图文】_babylater_51CTO博客
一般来说,为了保持系统ABI
的兼容性,系统的systemd
版本不会特别激进,所以需要老一点文档,比如CentOS7
运行的systemd
对应的版本文档应该是这个systemd.service (archive.org)
多进程保活
首先最官方的文档在这里:systemd.service (www.freedesktop.org)
不过需要注意的是,需要注意操作系统上面使用的systemd
的版本,通过执行systemd --version
看到,比如我这个版本就是systemd 219
,而最新的文档是systemd 250
(这个可以在上面url
页面的右上角看到)
但是,如果正在使用的systemd
的版本和文档版本相差太大,可能会出现不准确的情况。比如在systemd 230
之前是没有StartLimitInterSec
这个选项的。此时就需要这个网站https://web.archive.org/,它会给网页拍摄快照,相当棒。此外,[systemd.unit 中文手册 金步国] (jinbuguo.com)这位译者翻译了相关文档,不过也请注意文档版本的问题。
创建配置文件(设定重试次数)
配置文件需要创建在/etc/systemd/system/
文件夹里面,比如一个配置文件如下,文件名/etc/systemd/system/program.service
[Unit]
Description=program's service
[Service]
Type=idle
Environment=LD_LIBRARY_PATH=.:/export/home/admin/usr/install/gcc940/lib
ExecStart=/export/home/admin/gamed/program/bin/program gamesys.conf 1
Restart=always
RestartSec=5
StandardOutput=null
StandardError=null
StartLimitInterval=40000000
StartLimitBurst=3
[Install]
WantedBy=multi-user.target
新版本的系统(
systemd 230
之后),没有StartLimitInterval
需要使用StartLimitIntervalSec
,并且StartLimitIntervalSec
和StartLimitBurst
两个项在[Unit]
节区!!!详情请通过https://web.archive.org/查询和系统systemd
版本对应的文档
然后通过systemctl start program.service
启动服务,通过systemctl status program.service
查看服务状态和启动失败原因,通过systemctl stop program.service
关闭服务。
首先一个服务的配置文件是.service
作为后缀的,结构类似于windows
的.ini
配置文件,其中一般由三个部分。分别是
[Unit]
:包含与单元类型无关的通用信息[Service]
:其中是服务的属性[Install]
: 该小节包含单元的启用信息。 事实上,systemd(1) 在运行时并不使用此小节。 只有 systemctl(1) 的 enable 与 disable 命令在启用/停用单元时才会使用此小节(个人理解:决定在systemd
处于什么目标状态下有效)
其中有多个选项,例如上面的配置文件,含义分别如下
Description
是作为服务的描述Type
表示服务的类型,可以是simple exec forking oneshot dbus notify
,一般使用simple
Environment
可以指定服务会用到的环境变量ExecStart
是通过systemctl start xxx
启动服务时执行的命令- 需要注意的是,实测这里不能直接指定
>
重定向到文件,如有需要见下面StandardOutput
- 需要注意的是,实测这里不能直接指定
Restart
表示重启的条件,可以取no
,on-success
,on-failure
,on-abnormal
,on-watchdog
,on-abort
,always
之一RestartSec
如果重启,两次重启之间的间隔 默认是100ms
StandardOutput
标准输出,老版本(比如Systemd 219
)不能直接指定文件,新版本可以这样指定文件file:/var/log/xxx.log
StandardError
同上不过是标准错误StartLimitInterval
和StartLimitBurst
这两个表示在StartLimitInterval
指定的时间里重试失败StartLimitBurst
次则放弃重试,- 可以通过
systemctl reset-failed
重置失败次数, - 需要注意的是,手动停止服务也会被计数,并且如果设定上面两个参数,失败后必须手动重置
- 再者,
Systemd 230
之后使用StartLimitIntervalSec
替代了StartLimitInterval
这里很坑...所以需要注意文档版本 - 新版本这个选项是在
Unit
节区
- 可以通过
WantedBy
它的值是一个或多个Target
,当前Unit
激活时(enable
)符号链接会放入/etc/systemd/system
目录下面以Target
名 +.wants
后缀构成的子目录中(这里放一个我自己的理解,
systemd
有类似于initd
的运行级别的东西,详见浅析init和systemd【图文】_babylater_51CTO博客 的Sysvinit 运行级别和 systemd 目标的对应表
,所以WantedBy
设置为multi-user.target
的含义就比较明确了,也即是systemdctl enable xx.service
之后,在对应目标状态下启用)
具体的含义见systemd.service (www.freedesktop.org)
以上配置能够实现的效果就是进程因为任何方式停止运行(除了手动stop
),都会触发重启,但是在4000000
秒之内只重启3
次,重试三次不成功,就不再尝试,此时并不能直接systemctl start program
,需要首先systemctl reset-failed
(重置失败计数)之后才能再次start
如果不使用
StartLimitIntervalSec
和StartLimitBurst
就不需要考虑systemctl reset-failed
的使用了
多进程服务管理
如果需要创建很多服务,但是服务的配置文件只有ExecStart
项有细微区别,那么可以考虑使用模板功能。
比如,创建服务文件/etc/systemd/system/ping@.service
[Unit]
Description=Ping service %i
[Service]
Type=simple
ExecStart=/usr/bin/ping %i
[Install]
WantedBy=multi-user.target
启动进程可以这样systemctl start ping@127.0.0.1.service
,实际上,启动服务可以省略.service
后缀,也即是systemctl start ping@127.0.0.1
,如果要一次启动多个服务,可以systemctl start ping@127.0.0.1 ping@127.0.0.2
,停止服务也是类似。
这样,如果想要ping
别的地址,只需要修改命令中@
之后的字符串就好了。
也支持如下这样拼接字符串
[Unit]
Description=Ping service %i
[Service]
Type=simple
ExecStart=/usr/bin/ping 127.0.0.%i
[Install]
WantedBy=multi-user.target
systemctl start ping@1
就能执行ping 127.0.0.1
服务
对于配置文件中的%i
其实是有大小写区别的,%i
是转义之后的字符串 %I
是不转义的字符串,对于完整的说明符列表,见systemd.unit (www.freedesktop.org)
链式启动(服务依赖)
有这么一种情况,需要同时启动多个服务,并且他们有启动顺序的限制。那么可以像下面这么配置
假设有 A进程
、 B进程
、 C进程
,想要按顺序依次启动,那么可以这么配置
/etc/systemd/system/C.service
[Unit]
Description=C Process
Requires=B.service
After=B.service
[Service]
Type=simple
ExecStart=/export/CProgram
[Install]
WantedBy=multi-user.target
/etc/systemd/system/B.service
[Unit]
Description=B Process
Requires=A.service
After=A.service
[Service]
Type=simple
ExecStart=/export/BProgram
[Install]
WantedBy=multi-user.target
/etc/systemd/system/A.service
[Unit]
Description=A Process
[Service]
Type=simple
ExecStart=/export/AProgram
[Install]
WantedBy=multi-user.target
效果是,systemctl start C.service
之后几个进程会依次启动,Requires
指定了几个服务之间的依赖关系,因为通过After
选择指定了服务间启动顺序,所以几个服务是依次启动的。如果没有After
,启动顺序不被保证
如果,此时systemctl stop A.service
,那么几个服务都会被关闭,因为Requires
要求了前置服务必须存在,否则自身也不应该启动。如果不想自身服务被关闭,那么可以把Requires
(要求)替换成Wants
(想要)。
如果要形成依赖链,除了After
也可以使用Before
完整说明参见systemd.unit (www.freedesktop.org)
指定关闭进程方式 - ExecStop
可以通过ExecStop
选项关闭由ExecStart
启动的服务,因为有些程序需要发送特定的信号才能安全退出,所以这个选项会很有用。而对于其他被主进程拉起来的进程,按照KillMode
的设置处理,默认情况下,停止服务会关闭主进程以及主进程启动的所有子进程。
而对于KillMode
有如下几个设置,分别是
control-group
:会干掉主进程及子进程这是默认选项
mixed
:SIGTERM
信号被发送到主进程,而随后的SIGKILL
信号被发送到单元控制组的所有剩余进程,可以通过KillSignal
设置关闭主进程的信号process
: 仅关闭主进程none
: 什么也不干
详情见:systemd.kill (www.freedesktop.org)
例如,如果要事先约定某进程需要发送SIGUSR1
信号才能安全结束,那么可以在[Service]
节区设定ExecStop=kill -SIGUSR1 $MAINPID
。
上文
$MAINPID
类似于环境变量,表示主进程的pid
,完整列表见[systemd.exec (www.freedesktop.org)](https://www.freedesktop.org/software/systemd/man/systemd.exec.html#Environment Variables Set or Propagated by the Service Manager)
查看服务输出 - journalctl
systemd
不仅用来运行服务,它同时也有日志服务,用于取代老系统的syslog
。
运行的服务标准输出和错误输出会被交给journald
管理,查看某个服务可以使用这样的命令journalctl -u ping@1
带-e
参数可以跳到最新一行 -f
参数可以看到实时输出,-n
参数可以指定输出的行数,-r
反序输出。
例如journalctl -u ping@1 -e
或者 journalctl -u ping@1 -f
如果服务的输出太多,那么可以在.servive
文件中的[Unit]
节区配置StandardOutput=null
也可以通过systemctl status xx.service
查看服务的部分输出
具体使用参考
持久化journalctl日志清空命令查看配置参数详解_陈沩亮博客 (chenweiliang.com)
journalctl (www.freedesktop.org)
Linux 多进程服务配置 systemd的更多相关文章
- Linux ISCSI服务配置
Linux ISCSI服务配置,客户端进行访问 环境配置: server端 172.25.0.11 client端 172.25.0.10 配置ISCSI服务端 1.安装软件包 yum install ...
- Kali Linux常用服务配置教程获取IP地址
Kali Linux常用服务配置教程获取IP地址 下面以Kali Linux为例,演示获取IP地址的方法 (1)设置网络接口为自动获取IP地址.在Kali Linux的收藏夹中单击图标,将显示所有的程 ...
- Kali Linux常用服务配置教程启动DHCP服务
Kali Linux常用服务配置教程启动DHCP服务 通过前面的介绍,DHCP服务就配置好了.接下来,用户就可以使用该服务器来获取IP地址了.下面将对前面配置的服务进行测试. 1.启动DHCP服务 如 ...
- Kali Linux常用服务配置教程安装及配置DHCP服务
Kali Linux常用服务配置教程安装及配置DHCP服务 在Kali Linux中,默认没有安装DHCP服务.下面将介绍安装并配置DHCP服务的方法. 1.安装DHCP服务 在Kali Linux中 ...
- Kali Linux常用服务配置教程DHCP服务原理
Kali Linux常用服务配置教程DHCP服务原理 动态主机配置协议(Dynamic Host Configuration Protocol,简称DHCP)是一个局域网的网络协议,基于UDP协议工作 ...
- Linux vsftpd服务配置以及三种验证方式以及常见错误解决办法
文件传输协议(FTP): 文件传输协议(FTP,File Transfer Protocol),即能够让用户在互联网中上传.下载文件的文件协议,而FTP服务器就是支持FTP传输协议的主机,要想完成文件 ...
- Linux vsftpd服务配置具体解释
[背景] 近日.一朋友dominoserver要进行升级.迁移,搭建了linux測试系统,也开启vsftpd服务,但是配置的ftp账号,程序无法正常下载附件. [问题跟踪] 通过ftpclient连接 ...
- linux nfs服务配置挂载以及oracle使用nfs存储挂载注意事项
服务端共享目录 /home/XXX/nfs_shared 172.16.22.0/24(rw,no_root_squash) service nfs restart 常用命令: 查看所有nfs共享目录 ...
- Linux NTP服务配置 for Oracle RAC
安装Oracle 11g RAC时,我们需要配置ntp服务.在使用虚拟机的情况下对于时钟同步方式的配置有很多种方式,可以使用vmware自带的时钟同步功能,也可以直接将本地的一个节点用作时间服务器.本 ...
- linux samba 服务配置及日志管理
2012-01-16 安装samba共需3个rpm包 samba-common-3.0.23c-2.i386.rpm samba-3.0.23c-2.i386.rpm samba-cli ...
随机推荐
- TypeScript工具类 Partial 和 Required 的详细讲解
场景描述: 场景描述:一个接口(IPerson)有很多个的字段,可能有几百.而且这些字段都是必须的. 我们需要使用这个接口,但是我又不可能使用它的全部.可能只会使用几个. 我还必须要使用这接口.这个时 ...
- gin启动https支持
gin是一个使用Go语言开发的Web框架,具有运行速度快,分组的路由器,良好的崩溃捕获和错误处理,支持中间件等. 在工作中有时候需要支持https服务,gin可以通过中间件的方式来提供对https的支 ...
- 手撕Vue-监听数据变化
经过上一篇的介绍,已经实现了将模板编译成具体数据,接下来要介绍的是如何监听数据的变化,本章主要完成这个需求即可. 在我们文章的开始,我写了一个 Vue 双向数据绑定原理的文章当中封装了一个 Obser ...
- Walrus 0.5发布:重构交互流程,打造开箱即用的部署体验
开源应用管理平台 Walrus 0.5 已于近日正式发布! Walrus 0.4 引入了全新应用模型,极大程度减少了重复的配置工作,并为研发团队屏蔽了云原生及基础设施的复杂度.Walrus 0.5 在 ...
- 数据挖掘[一]---汽车车交易价格预测(测评指标;EDA)
题目出自阿里天池赛题链接:零基础入门数据挖掘 - 二手车交易价格预测-天池大赛-阿里云天池 相关文章: 特征工程详解及实战项目[参考] 数据挖掘---汽车车交易价格预测[一](测评指标:EDA) 数据 ...
- win10 局域网共享文件创建方法
win10 局域网共享文件创建方法 1.先在桌面文件夹,我命名为"xxxx",然后将文件放在该文件里. 2.右击共享文件夹,找到属性选项,点击"属性".再点击& ...
- PE结构:VA&RVA&FOA 转换复习
复习一下,不然会忘 1.imagebase 映像基地址 ,默认是0x400000 2.va 虚拟地址,载入OD后的地址,已经映射到内存的地址. 计算实际装入地址 VA imagebase (映像基址) ...
- Walrus 实用教程|Walrus + Gitlab,打通CI/CD 自动化交付!
Walrus file 是 Walrus 0.5 版本推出的新功能,用户可以通过一个非常简洁的 YAML 描述应用或基础设施资源的部署配置,然后通过 Walrus CLI 执行 walrus appl ...
- 自己封装的 Python 常用工具库(prestool)
一.安装 需Python 版本建议 3.7 以上 pip install --upgrade prestool 二.常用工具 from prestool.Tool import Tool tool = ...
- 技嘉水雕II 360水冷散热器评测:稳压340W i9-14900K
一.前言:极简卡扣连锁风扇设计 再多风扇也只需2根线 如今这个年代,DIY主机几乎都会配大量的RGB风扇,然而"光污染"虽然带来了视觉感官享受,在理线方面却非常繁琐. 就拿360水 ...