软件看门狗:让服务永不宕机

初级代码游戏的专栏介绍与文章目录-CSDN博客

我的github:codetoys,所有代码都将会位于ctfc库中。已经放入库中我会指出在库中的位置。

这些代码大部分以Linux为目标但部分代码是纯C++的,可以在任何平台上使用。


缘起

        看门狗WatchDog是个硬件领域的概念,硬件一般没人盯着看,没人去重启,只能靠硬件自己来处理,所以使用一些专门硬件来确保故障后能恢复运行——一般也就是复位重启。其机制也很简单,就是硬件定时器,超时重启,如果运行正常,代码会在超时之前将定时器复位,避免重启。

        现在的硬件“软化”程度很高,很多所谓“硬件盒子”其实就是个拆掉显示器和键盘的电脑,跑的是标准的linux/windows/android。

        最近给一个盒子写程序,盒子是别人做的,我只写软件。盒子是个简化版linux,大部分开发工作和纯软件开发并无区别,只是遇到莫名其妙地跟盒子无法通讯了这就头疼了。

        因为这是软件内部出的问题,所以软件自己要想办法发现。解决问题倒是很简单:重启即可。

        为了在软件层面及时发现问题自动重启,需要实现看门狗一样的功能。

分析

        有这么几个考虑的因素:

  • 尽可能在外围,不深入被监控的代码,不会被无意修改
  • 尽可能独立,不会因为被监控代码的故障而失效
  • 自身容错,不会导致重启时间太长或太频繁
  • 针对不明确的故障,因为明确的故障应该直接解决了

        以上几条是考虑这些问题:

  • 如果系统是因为某个原因卡住了,怎么办?
  • 如果系统是因为罕见的异常出错,怎么办?
  • 如果嵌入的代码被修改或移除,怎么办?
  • 如果故障是因为存储满了,怎么办?

        所有这些问题都是很难解决的,看门狗的思路不是创造无错代码,而是让有错误的代码能够恢复运行。

措施

双进程监控(fork)

        双进程监控可以解决进程挂了的问题,监控进程因为太过简单,几乎不可能出错(硬件里面也没有人去手工kill -9)。监控进程应该足够简单,屏蔽所有可以屏蔽的信号,除了等待子进程结束之外什么都不做。

监控业务代码卡死

        业务代码卡死,或者陷入故障循环,不会导致进程挂掉,双进程监控就解决不了这个问题了。只能手工设置监控点,通过定时检查监控点的状态来判断是否有故障。

        例如,可以用一段时间内是否完成了业务来判断。在业务处理结束的地方设置一个全局变量,记录完成时间,那么只需要定时检查这个变量是否超过设定限度,比如这个值是10分钟前,说明10分钟内都没有完成任何业务,不妨重启一下(即使是真的没有业务可做,重启一下也没什么大不了,当然可能会恰好错过几个业务,但相比故障几天后找人去重启设备就是很小的损失了)。

存储满怎么办

        存储满很难监控,也很难避免,可以在重启系统前删掉一些东西,保证重启后肯定有足够空间就可以了。

        例如可以删掉最早的日志文件或数据文件。当然这引出一个话题:不能无限制写日志。

写文件要限制大小

        所有写文件的机制都应该加上最大大小限制,不然写满整个存储是必然发生的事。即使如此,也可能因为各种问题导致占用了非预期的空间,比如文件复制、删除的失败导致遗留文件,所以存储满的情形时一定要考虑的。

代码

        哎,代码太简单了,不好意西贴出来骗字数。


(这里是结束)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/553640.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

MySQL连接查询之等值连接

连接查询 又称多表查询,当查询结果来自多张数据表的时候,就需要用到连接查询。 建一个新库包含两张表实验(ta:id,age字段,tb:id,name,ta_id): …

基于SpringBoot的“人职匹配推荐系统”的设计与实现(源码+数据库+文档+PPT)

基于SpringBoot的“人职匹配推荐系统”的设计与实现(源码数据库文档PPT) 开发语言:Java 数据库:MySQL 技术:SpringBoot 工具:IDEA/Ecilpse、Navicat、Maven 系统展示 网上商城购物系统结构图 管理员登录界面图 个…

WebKit内核游览器

WebKit内核游览器 基础概念游览器引擎Chromium 浏览器架构Webkit 资源加载这里就不得不提到http超文本传输协议这个概念了: 游览器多线程HTML 解析总结 基础概念 百度百科介绍 WebKit 是一个开源的浏览器引擎,与之相对应的引擎有Gecko(Mozil…

CTFHUB RCE作业

题目地址:CTFHub 完成情况如图: 知识点: preg_match_all 函数 正则匹配函数 int preg_match_all ( string $pattern , string $subject [, array &$matches [, int $flags PREG_PATTERN_ORDER [, int $offset 0 ]]] )搜索 subject 中…

rust学习(BorrowMut异常)

现象: 编译没有问题,运行时出现: 代码: pub fn do_test() {let v Arc::new(RefCell::new(100));let v1 v.try_borrow_mut().unwrap();let v2 v.try_borrow_mut().unwrap(); } 原因: 一个cell貌似不能同时被借用…

实际案例分享:如何利用上位机优化生产过程

在现代工业生产中,利用上位机进行生产过程优化已成为一种常见的做法。通过实时监控、数据采集和远程控制,上位机可以帮助企业提高生产效率、降低成本,并实现生产过程的自动化和智能化。本文将通过一个实际案例来介绍如何利用上位机优化生产过…

Nature 哈佛新型超材料Metafluid粘度、透明度、弹性可变,可用于编程液压机器人

液体都有“智能”、可编程了? 最近,一种被称为“智能"液体的多功能可编程的新型超材料——Metafluid,登上了Nature。 它由哈佛大学SEAS的研究团队研发,据说可自由调节弹性、光学特性、粘度。 甚至能够在牛顿流体和非牛顿流…

RHCE第二次作业

一.配置server主机要求如下: 1.server主机的主机名称为 ntp_server.example.com 2.server主机的IP为: 172.25.254.100 3.server主机的时间为1984-11-11 11:11:11 4.配置server主机的时间同步服务要求可以被所有人使用 二.设定cli…

【Python】异常处理结构

文章目录 1.python异常2.try_except异常处理结构3.try... 多个except异常处理4.try_except_else异常处理结构5.try_except_finally异常处理结构6.常见报错类型 在运行代码时,总是遇到各种异常,且出现异常时,脚本就会自动的的停止运行&#xf…

网络编程day5

目录 使用select实现TCP并发服务器 使用poll实现TCP客户端 UDP实现网络聊天室 服务器 ser.h main.c func_ser.c makefile 客户端 cli.h main.c func_cli.c makfile 思维导图 使用select实现TCP并发服务器 #include <myhead.h> int main(int argc, const c…

Create AI大会|人人皆可成为开发者,探索人工智能新趋势

在数字化浪潮的推动下&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度渗透到我们生活的方方面面。2024年4月16日&#xff0c;备受瞩目的Create 2024百度AI开发者大会在深圳国际会展中心&#xff08;宝安&#xff09;盛大开幕。大会以“创造未来”为主题…

47.基于SpringBoot + Vue实现的前后端分离-校园外卖服务系统(项目 + 论文)

项目介绍 本站是一个B/S模式系统&#xff0c;采用SpringBoot Vue框架&#xff0c;MYSQL数据库设计开发&#xff0c;充分保证系统的稳定性。系统具有界面清晰、操作简单&#xff0c;功能齐全的特点&#xff0c;使得基于SpringBoot Vue技术的校园外卖服务系统设计与实现管理工作…

人才测评的方法有哪些?

人才测评是企业在筛选人才的时候必然会使用的策略&#xff0c;为了节省企业HR在招聘时的成本&#xff0c;又极大提高了人才和岗位的匹配度&#xff0c;从企业发展和员工个人发展来看&#xff0c;起到了双赢的作用&#xff0c;在线人才测评是现代企业招聘&#xff0c;人才选拔&a…

力扣哈哈哈哈

public class MyStack {int top;Queue<Integer> q1;Queue<Integer> q2;public MyStack() {q1new LinkedList<Integer>();q2new LinkedList<Integer>();}public void push(int x) {q2.offer(x);//offer是入队方法while (!q1.isEmpty()){q2.offer(q1.pol…

如何通过Postgres的日志进行故障排查?

文章目录 一、配置日志记录二、查看和分析日志三、使用日志进行故障排查的示例四、总结 在进行数据库管理和维护时&#xff0c;日志分析是一项至关重要的技能。PostgreSQL的日志记录功能可以帮助我们追踪数据库的运行状态&#xff0c;定位问题&#xff0c;以及优化性能。下面&a…

51单片机入门_江协科技_33~34_OB记录的自学笔记_LED呼吸灯与PWM直流马达调速

33. 直流电机驱动(PWM) 33.1. 直流电机介绍 •直流电机是一种将电能转换为机械能的装置。一般的直流电机有两个电极&#xff0c;当电极正接时&#xff0c;电机正转&#xff0c;当电极反接时&#xff0c;电机反转 •直流电机主要由永磁体&#xff08;定子&#xff09;、线圈&…

如何规划数据中台

1. 数据中台是一套解决方案 数据中台是一套可持续“让企业数据用起来”的机制&#xff0c;是一套解决方案&#xff0c;不仅是一个平台。让数据更加灵活地支撑前端业务&#xff0c;通过持续沉淀企业数据复用能力形成数据从采集、治理、开发到数据服务的一整套数据使用的机制。 …

SpringBoot 监控 SQL 运行情况(实战教程)

1 基本概念 2 添加依赖 3 配置相关属性 4 sql监控 5 慢sql记录 6 spring 监控 7 去 Ad&#xff08;广告&#xff09; 8 获取 Druid 的监控数据 1 基本概念 Druid是Java语言中最好的数据库连接池。 虽然HikariCP的速度稍快&#xff0c;但是&#xff0c;Druid能够提供强…

【考研高数】学习笔记分享

派大星说数学&#xff08;导学部分&#xff09; 关于做题 测试 答疑阶段 直播 群内 高中基础知识导学 一、数与式 述了课程学习和因式分解、分式拆解等知识点。学生应了解课程内容&#xff0c;带着疑问听课&#xff0c;不要抄笔记&#xff0c;导学课和基础课都有测验&…

mac安装nvm详细教程

0. 前提 清除电脑上原有的node (没有装过的可以忽略)1、首先查看电脑上是否安装的有node,查看node版本node -v2、如果有node就彻底删除nodesudo rm -rf /usr/local/{bin/{node,npm},lib/node_modules/npm,lib/node,share/man/*/node.*}2、保证自己的电脑上有安装git,不然下载n…