首页
学习
活动
专区
工具
TVP
发布

Shell实现守护进程

开篇

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

楔子

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

正文

1. 前提

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

2. 流程设计

下面我们来描述一下整个守护进程的运行流程。

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

3. 方案实现

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

3.1 获取服务列表

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

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

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

3.2 检查服务状态

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

服务检测代码如下所示

3.3 服务的启停

同样,服务的启动也是调用service的start和stop,实现代码如下

3.4 服务的唤起与移除监听

让我们先来看一下如何将服务从监听列表中移除

对于服务重试拉起的操作我们采用递归的方式,尝试拉起的次数我们也放在中进行管理。以下为重试拉起的逻辑

这里当重试次数为0的时候进入else逻辑,这时就会调用接口将服务从监听列表中移除

3.5 主控程序

至此服务的基本操作功能已经实现完毕了,此时我们需要来实现主控程序

这段逻辑中主要就是查看监听列表是否为空和循环检测服务状态并保活。下面我们顺道来实现一下守护进程的退出、运行状态检查和服务状态检查功能。

3.6 工具的启动

既然叫做守护进程,肯定是要在后台悄悄的进行,所以我们需要实现一个后台执行功能

其实这里就是调用3.5主控程序中的status和start命令来实现

3.7 工具的安装

既然守护进程的定位是一个工具,那么就一定要在任意路径下都能执行的特点,所以这里就需要将守护进程添加至service中

由于守护进程本身也是脆弱的,可能会随时挂掉,所以我们可以将其添加至系统的定时任务中

4 工程结构

到这里工具的主要逻辑已经讲解完毕了,现在让我们来看看工程的完整结构

工程中有一部分代码并没有在本文中展示,大家有兴趣了可以在公众号回复来获取工程的下载路径。

5. 演示

5.1 工具安装

5.2 工具的启动

5.3 服务状态的查看

该机器下面并未安装这几个服务,所以会提示service不存在

5.4 查看日志

至此本文的全部内容结束,关于下一篇文章的内容暂未想好,这里就先不做公布了

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180725G1M60O00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券