【造轮子】Shell实现守护进程

开篇

虽然在程序猿的世界里流行一个谚语”不要重复造轮子”。但是如果你开的就是一辆16寸轮毂的A级车,给你一副21寸的宾利轮毂你也是装不上的。就算是运气好找到了一副18寸的奥迪轮毂,可以正常的安装并行驶,但是大轮毂所带来的车速表不准,舒适度下降的问题又是不可避免的。所以适当的造造轮子也不失是一种节约后期维护成本的做法。所以从本篇开始,再次新开一个章节–造轮子,跟大家聊聊关于造轮子的一些经历。

楔子

在微服务平台中有些许多保证服务稳定性的方案。但是对于传统主备,双主的方案中,如何保证服务挂掉后能够快速上线?守护进程就属于一种性价比很高的方案。它占用资源小,对现有架构无改动。现在我们就在本篇中聊聊如何设计一款通用型的守护进程工具。

正文

1. 前提

在设计守护进程之前,我们需要为我们所有待监测的服务添加service,并且需要service实现start,stop,status这三种指令。因为在我们设计的守护进程中是通过这这三种命令来改变服务的状态的。

2. 流程设计

下面我们来描述一下整个守护进程的运行流程。
mark
服务启动以后,系统会初始化服务监测列表,将所有待监测的服务都添加至列表中。然后判断监测列表是否为空,如果为空则停止守护进程。反之,继续下一步。现在开始循环执行后面的步骤。间隔n秒后我们会循环监测每一个服务,如果服务挂掉则连续最多n次尝试拉起服务。如果服务被正常拉起则继续循环监测下一个服务,如果尝试n次后也没有拉起服务则将该服务从监听列表中移出。因为如果服务多次尝试都没有启动成功,那么此时肯定是有什么因素导致服务无法自动恢复,这时候就需要人工介入来排查问题恢复服务(其实这里比较好的做法是当服务无法唤起的时候,通过电话或者邮件的形式通知运维人员)。至此一个监测循环结束,进入下一个循环。

3. 方案实现

看完整个流程,现在我们来聊聊具体的实现,这里我们采用Shell来实现全部功能。

3.1 获取服务列表

为了方便配置监听的服务,我们将所有带监听服务的service名称写入配置文件service.list

user
security
meeting

他们对应着/etc/init.d中配置的service名称。获取服务监听列表就可以这样来写

# 本地服务列表
localService=`cat conf/service.list`

# 获取监听服务列表
function getServiceList() {
   
    echo $localService
}

简单的通过文件读取命令cat就可以获取到待监听的服务列表。

3.2 检查服务状态

通过service实现的status方法来检测服务的状态,其中可以使用服务正常运行时的关键词来过滤。为了对配置信息进行统一的管理,我们将服务运行状态的关键字放在。system.constant.sh

#!/bin/sh
# 系统常量

# 服务运行标识
runFlag='进程号'

服务检测代码如下所示

# 检查服务状态
# $1 service 名称
function checkService() {
    if [ `service $1 stat
  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值