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

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

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

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


缘起

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

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

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

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

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

分析

        有这么几个考虑的因素:

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

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

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

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

措施

双进程监控(fork)

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

监控业务代码卡死

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

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

存储满怎么办

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

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

写文件要限制大小

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

代码

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


(这里是结束)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双碳目标下基于“遥感+”集成技术的碳储量、碳排放、碳循环、温室气体等多领域监测与模拟

以全球变暖为主要特征的气候变化已成为全球性环境问题,对全球可持续发展带来严峻挑战。2015年多国在《巴黎协定》上明确提出缔约方应尽快实现碳达峰和碳中和目标。2019年第49届 IPCC全会明确增加了基于卫星遥感的排放清单校验方法。随着碳中和目标以及全球碳盘点的现…

Verilog中#的2种作用

在Verilog中,#有2种作用。 第一种作用是指定时间延时,如#10,表示延时10个时间单位; 第二种作用在模块定义时指定常量型参数的默认值,在模块实例化时传递常量型参数的指定值。 module uart_tx //采用#()形式定义常量型…

[stm32]DMA使用

自动重装和M2M(软件trig)不能一起使用,否则会停不下来 void MyDMA_Init(uint32_t AddrA,uint32_t AddrB,uint16_t Size){RCC_AHBPeriphClockCmd(RCC_AHBPeriph_DMA1,ENABLE);DMA_InitTypeDef DMA_InitStructure;DMA_InitStructure.DMA_PeripheralBaseAddrAddrA;//外…

爬楼梯(c)

文章目录 描述分析思路关键代码运行结果 描述 给定一个整数数组 cost ,其中 cost[i]是从楼梯第i 个台阶向上爬需要支付的费用,下标从0开始。-旦你支付此费用,即可选择向上爬一个或者两个台阶 要求:请你计算并返回达到楼梯顶部的…

在使用lombok的@Slf4j时,启动项目报错。java:找不到符号

问题背景: 在使用lombok的Slf4j时,启动项目报错。 java:找不到符号符号: 方法info(java.lang.String,java.lang.String)位置: 类型为org.apache.ibatis.logging.Log的变量 log解决方式: 在如图所示位置加…

mysql的常用配置

1. 设置MySQL字段名不区分大小写 [mysqld] lower_case_table_names1 2. GROUP BY 字段不需要在 SELECT 查询中出现 在 SQL 中,通常要求在 SELECT 语句中的 GROUP BY 字段也必须出现在 SELECT 字段列表中,这是为了确保查询的一致性,并且遵循…

Rust开发笔记 | IDE选择与Rust工具链配置指南

在当代编程语言中,Rust以其独特的内存管理和类型系统,提供了无与伦比的安全性和性能,尤其在系统编程领域表现突出。选择合适的集成开发环境(IDE)和配置正确的工具链,对于提升Rust开发效率至关重要。本文将为…

在线预约家政服务小程序上门服务源码系统 带完整的安装代码包以及搭建教程

随着互联网的快速发展,家政服务行业也逐渐向线上化、智能化转型。为了满足广大用户的需求,罗峰给大家分享一款在线预约家政服务小程序上门服务源码系统。该系统不仅功能完善,而且操作简单,是您打造高效、便捷的家政服务平台的首选…

MySql 表中的id突然变很大,如何给id重新排序

目录 一、场景 二、解决方法 一、场景 我们在开发过程中,难免遇到id突然增大的情况。 由于id突然增大很多,我们重新增加数据时候id会默认加1 那么如何让id 重新从1按顺序排序呢 二、解决方法 点击编辑表,然后新建一个字段id2,将…

探索分布式系统监控zabbix-------------监控Windows

扩展windows 10 server2012 server2016 server2019 监控 一、在虚拟机中安装zabbix的客户端 下载网站 Download and install Zabbix 安装系统一直托不进虚拟机中;因为没安装Tools组件 点击虚拟机,选择安装VMware Tools 查看主机名 二、在web页…

C语言——通讯录的实现

一.前言 嗨嗨嗨&#xff0c;又和大家见面了&#xff01;前面我们讲到了如何实现一个循序表。现在我们开始讲解如何基于循序表来实现通讯录功能。 二.正文 通讯录中的SeqlList.h #pragma once //#define SLDateType int #include<stdio.h> #include<stdlib.h> #…

每天五分钟计算机视觉:基于卷积操作完成滑动窗口的图片分类?

本文重点 我们前面学习了使用不同大小的滑动窗口来滑动图片,然后切分成许多小的图片,然后依次应用到我们已经训练好的图像分类模型中,但是这种方式效率太低了,本节课程我们学习一种新的方式,来看一下如何并行识别这些剪切的图片。 原始结构 首先我们先来看一下,如何把…

InCopy2024安装包(亲测可用)

目录 一、软件简介 二、软件下载 一、软件简介 InCopy是一种专业的文字处理软件&#xff0c;由Adobe公司开发。它通常与Adobe InDesign一起使用&#xff0c;主要用于协作式工作流程中的文本编辑和校对。通过与InDesign的集成&#xff0c;InCopy实现了文本编辑和设计分离&#…

内存相关知识(新)

基本概念 内存层次结构&#xff1a;内存层次结构是一种层次化的存储设备结构&#xff0c;它包括寄存器、缓存、主存和辅助存储器。每一层次的存储设备都有不同的速度、容量和成本。 内存单元&#xff1a;内存被划分为一系列连续的内存单元&#xff0c;每个单元都有一个唯一的地…

初步了解InnoDB存储引擎的架构设计

1. 更新语句在MySQL中是如何执行的&#xff1f; 之前我们已经分析了MySQL架构上的整体设计原理&#xff0c;现在对一条SQL语句从我们的系统层面发送到MySQL中&#xff0c;然后一步一步执行这条SQL的流程&#xff0c;都有了一个整体的了解。 我们已经知道了&#xff0c;MVSQL最…

什么是R-tree?

R-tree 是一种空间索引结构&#xff0c;专为高效存储和检索多维数据&#xff08;如地理空间数据或图像处理中的像素块&#xff09;而设计。它是 B-tree 数据结构在多维度空间下的扩展&#xff0c;特别适合于处理高维空间中的对象&#xff08;如点、线、多边形等&#xff09;的索…

Springboot 初始化操作

在使用Springboot过程中&#xff0c;或多或少我们会遇到在Springboot启动时要初始化类&#xff0c;或者加载文件之类的一些操作。关于初始化&#xff0c;主要分为两类&#xff0c;一类是在程序启动后的执行初始化操作&#xff0c;另一类是Bean实例化时执行初始化操作&#xff0…

3D Tiles 规范(一概述)

3D Tiles 专为流式传输和渲染大量 3D 地理空间内容而设计&#xff0c;例如摄影测量、3D 建筑、BIM/CAD、实例化要素和点云。它定义了分层数据结构和一组提供可渲染内容的Tile格式。3D Tiles 没有定义内容可视化的明确规则&#xff1b;客户可以根据自己认为合适的方式可视化 3D …

如何理解Vue 3组件的component关键字

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…

Verilog仿真跨模块调用内部信号的方法

在Verilog仿真时如果需要调用某子模块中的信号在本模块中使用可以使用层次化引用的方法&#xff0c;而不需要在rtl部分用端口引出来。 引用方式&#xff1a;当前例化模块名.子例化模块名.子子例化模块名.参数 将需要的信号引出。 注意是用例化模块名而不是用子模块名&#xff…