开发不停机的服务程序

news2024/11/14 14:40:27

使用守护进程、心跳机制、调度程序实现服务程序永不死机。
调度程序:启动服务程序,服务程序死掉后调度程序休眠n秒再次调度。

进程心跳:使用共享内存维护自己的心跳信息,当前时间减去最新时间如果大于超时时间就认为故障了,守护进程就会遍历共享内存,将其杀掉,并从共享内存中删除。

如何实现程序调度?(fork+exec函数)
在实际开发中,需要在调用execl函数之后继续运行后续代码,所以将fork函数与其结合起来。fork函数,去创建一个子进程,使用子进程去调用exe函数执行新的程序,这样就不会影响父进程代码的正常执行。父进程中,亦可调用wait函数,等待exe函数调用的新程序运行的结果。 这样即可实现程序调度的功能(比如,子进程执行了某个需要长期运行的服务程序,父进程会wait子进程的结果,如果服务程序故障,守护进程会查询到心跳信息,发送kill信号给服务程序让他结束,那么父进程收到结果继续重启该服务程序,因为最外层是一个while true循环)
在 shell 命令行执行 ps 命令,实际上是 shell 进程调用 fork 复制一个新的子进程,在利用exec 系统调用将新产生的子进程完全替换成 ps 进程。

exec系列函数都是通过execve系统调用实现的,将原进程的代码,数据,堆栈都替换成新进程,只有进程号没换。execl,execv区别是,l是参数通过列表一个一个进去且最后加一个NULL空指针,V是通过指针数组,char *const ps_argv[]={‘’,‘’}

共享内存
正常程序之间的内存是不允许相互访问的,但是共享内存允许多个程序访问同一快内存空间,共享内存区是最最高效的传递信息的IPC形式。在程序中我们通过指针映射进而操控读写共享内存内的文件。

创建共享内存函数shmget,这个函数用于获取共享内存,当没有时就创建共享内存。一般有三个参数,int shmget(key_t key , size_t size , int shmflag),第一个参数key是用来标识共享内存的,可以保证共享内存本身的唯一性
最后一个参数一般是0640|CREAT
shmat函数,其主要用处就是把共享内存链接到当前进程的地址空间,该函数的返回值是共享内存的地址,我们将该地址赋值给一个指针变量,即能实现够在当前进程中对共享内存进行读写的操作。

将共享内存与当前进程地址空间进行分离 shmdt函数,其作用为将共享内存与当前进程的联系断开。

释放共享内存 shmctl函数, 其主要目的就是将共享内存删除,将其所占用的空间进行释放,但是在实际操作中基本不会进行此操作。

我们可以通过ipcs和ipcrm命令对共享内存进行查看和删除等操作。

信号量:
P操作,计数器减一,申请资源。V操作,释放资源,计数器加1(PV是原子操作)

心跳机制
服务程序将自身的心跳信息保存在共享内存中,每隔特定时间进行更新,通过守护进程进行判断,当 当前时间与最后更新时间的差值大于设置的超时时间时,守护程序就会默认该服务程序死机,会先终止它,再发 送给信号重启该服务程序。

该心跳机制在代码实现中主要由两步构成,1.服务程序需要在共享内存中维护自己的心跳信息,包含文件名,进程ID,进程超时时间,和最后一次心跳时间等,2.守护程序终止已经死机的服务程序。(exit())

将守护进程封装成类,以便在后面进行调用,其中使用类的相关操作,回顾了下构造函数和构析函数

在这里插入图片描述

在这里插入图片描述
在写共享内存时需要加锁保护。

守护程序的实现
在这里插入图片描述
守护程序也是由调度程序实现。运行周期10秒。(调度程序有两种,一个就是周期性运行的,比如守护程序。另一种就是永不停机的,死掉后会重启)
避免被普通用户误杀,root用户启动

在终止流程中,会使用到析构函数和exit()函数,要注意 exit函数不会调用 局部变量的析构函数的(服务程序的局部变量),所以我们需要把包含析构函数的变量设置为全局变量,因为exit函数会调用 全局变量 的析构函数。(心跳机制类的析构函数就有删除已经超时的心跳激励,把共享内存从当前内存分离。)

为什么要kill -15?再kill -9。因为要让服务程序有善后代码,强行终止不好。一般每隔一秒测试一次是否存在进程,发送kill 0可以判断进程是否还存在。

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

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

相关文章

共享模型之不可变

1.日期转换的问题 1>.代码示例 Slf4j public class TestDateFormatDemo1 {public static void main(String[] args) {SimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd");for (int i 0; i < 10; i) {//多个线程调用日期格式化对象的方法new Thread(…

kafka监控工具安装和使用

1. KafkaOffsetMonitor 该监控是基于一个jar包的形式运行&#xff0c;部署较为方便。只有监控功能&#xff0c;使用起来也较为安全(1)消费者组列表 (2)查看topic的历史消费信息. (3)每个topic的所有parition列表(topic,pid,offset,logSize,lag,owner) (4)对consumer消费情况进…

使用Eureka搭建单击模拟到集群模拟

首先讲讲什么是Eureka:1.Eureka是Netflix的子模块&#xff0c;同样也是核心模块之一&#xff0c;Eureka是基于REST的服务&#xff0c;用于定位服务&#xff0c;以实现云端中间件层服务发现和故障转移&#xff0c;服务注册与发现对于微服务来说是非常重要的&#xff0c;有了服务…

vue项目第三天

论坛项目动态路由菜单以及渲染用户登录全局前置拦截器获取用户的菜单以及接口执行过程解析菜单数据&#xff0c;渲染伟动态路由。菜单数据将数据源解析为类似路由配置对象的格式&#xff08;./xxx/xxx 这种格式&#xff09;。下方是路由实例的代码,后面封装了很多方法这里也需要…

RFID服装吊牌材质分类

1、吊牌常见材质 铜版纸&#xff1a;最常用&#xff0c;分单铜纸、双铜纸 白卡纸&#xff1a;厚度较厚 黑卡纸&#xff1a;黑卡纸常用于烫金、烫银工艺 牛皮纸&#xff1a;韧度较高、色彩单一 塑料材料&#xff1a;一般一些比较高档的品牌会选塑料材质&#xff0c;成本比铜…

电商CRM的作用和用途

数据显示&#xff0c;使用电商CRM客户管理系统后&#xff0c;企业销售额提高了87%&#xff0c;客户满意度提高了74%&#xff0c;业务效率提高了73%。要在竞争激烈的电商市场取得成功&#xff0c;与目标受众的有效沟通是有效的方法。下面说说什么是电商CRM系统&#xff1f;电商C…

Docker镜像和容器操作,ლ(´ڡ`ლ)好吃的.

文章目录1.镜像操作1.镜像命令2.情景1&#xff1a;拉取镜像3.情景2&#xff1a;保存导入镜像2.容器操作1.容器命令2.情景1&#xff1a;创建并运行一个容器3.情景2&#xff1a;进入容器&#xff0c;修改文件3.结语halo&#xff0c;大家好&#xff0c;这次我带来的是Docker的一些…

SATA SSD需要NCQ开启吗?

一、故事开篇最近有同学在咨询&#xff0c;SATA SSD是否需要NCQ功能&#xff1f;借此机会&#xff0c;今天我们来聊聊这个比较古老的话题&#xff0c;关于SATA协议的NCQ的故事。首先我们先回顾下SATA与NCQ的历史&#xff1a;2003年&#xff0c;SATA协议1.0问世&#xff0c;传输…

微服务中API网关的作用是什么?

目录 什么是API网关&#xff1f; 为什么要用API网关&#xff1f; API网关架构 API网关是如何实现这些功能的&#xff1f; 协议转换 链式处理 异步请求 什么是API网关&#xff1f; Api网关是微服务的重要组成部分&#xff0c;封装了系统内部的复杂结构&#xff0c;客户端…

蓝牙Mesh学习笔记(一)

Mesh系统结构1 Mesh网络分层1.1 模型层(Model layer)1.2 基础模型层(Foundation Model layer)1.3 接入层(Access layer)1.4 上层传输层(Upper transport layer)1.5 下层传输层(Lower transport layer)1.6 网络层(Network layer)1.7 承载层(Bearer layer)1.8 BLE内核规范(BLE Co…

MySQL性能优化六 事物隔离级别与锁机制

概述 我们的数据库一般都会并发执行多个事务&#xff0c;多个事务可能会并发的对相同的一批数据进行增删改查操作&#xff0c;可能就会导致我们说的脏写、脏读、不可重复读、幻读这些问题。 这些问题的本质都是数据库的多事务并发问题&#xff0c;为了解决多事务并发问题&#…

CUDA内存管理一文理清|参加CUDA线上训练营

CUDA 内存概述 GPU的内存包括&#xff1a; 全局内存&#xff08;global memory&#xff09;常量内存&#xff08;constant memory&#xff09;纹理内存核表面内存&#xff08;texture memory&#xff09;寄存器&#xff08;register&#xff09;局部内存&#xff08;local me…

BI 到底是什么,看看这篇文章怎么说

随着数据价值得到了认可&#xff0c;数据开始成为个人、企业乃至国家的重要战略资产&#xff0c;但数据资产不能直接产生价值&#xff0c;而是需要通过数据分析、数据可视化等数据处理手段将数据转化为信息和知识&#xff0c;才能进行资产的价值化&#xff0c;这时候商业智能BI…

Python骚操作 - 实现把文字写在像素中

前言 嗨嗨&#xff0c;大家好 我是小圆 今天又发来个有意思的 用Python在照片中添加文字~&#xff08;实现把文字写在像素中&#xff09; 那咱就话不多说咯 直接开始展示 实现步骤 想要实现把文字写在像素中&#xff0c;那么我们就需要用到 pillow 这个神器。 众所周知&a…

从零实现高并发WebRTC服务器(六):OpenSSL协议,DTLS协议,RTP协议和SRTP协议

文章目录一、SSL协议二、OpenSSL三、TLS和DTLS四、DTLS的通信的步骤图五、RTP协议和SRTP协议5.1 详解RTP协议5.2 详解RTCP协议5.3 RTP && RTCP的协议的关键技术六、DTLS-SRTP协议一、SSL协议 SSL的全名叫做secure socket layer(安全套接字层)&#xff0c;最开始是由一…

【CSS 布局】 Sticky Footer布局

Sticky footer布局是什么&#xff1f; 我们所见到的大部分网站页面&#xff0c;都会把一个页面分为头部区块、内容区块和页脚区块&#xff0c;当头部区块和内容区块内容较少时&#xff0c;页脚能固定在屏幕的底部&#xff0c;而非随着文档流排布。当页面内容较多时&#xff0c;…

大数据框架之Hadoop:HDFS(三)HDFS客户端操作(开发重点)

3.1 HDFS客户端环境准备 1&#xff0e;根据自己电脑的操作系统拷贝对应的编译后的hadoop jar包到非中文路径&#xff08;例如&#xff1a;D:\javaEnv\hadoop-2.77&#xff09;&#xff0c;如下图所示。 2&#xff0e;配置HADOOP_HOME环境变量&#xff0c;如下图所示。 3&#…

分布式项目-品牌管理(7)

【今日成果】&#xff1a; //啊哈哈哈 &#xff0c; 莫名其妙入选了。 【快速回顾】&#xff1a; &#xff08;1&#xff09;&#xff1a; 虽然提交表单的时候前端做了校验&#xff0c;但是通过PostMAN接口调试&#xff0c;我们发现不规范的数据还是会被存储到数据库中&am…

前端基础知识6

谈谈你对语义化标签的理解语义化标签就是具有语义的标签&#xff0c;它可以清晰地向我们展示它的作用和用途。 清晰的代码结构&#xff1a;在页面没有css的情况下&#xff0c;也能够呈现出清晰的代码内容 有利于SEO: 爬虫依赖标签来确定关键字的权重&#xff0c;因此可以和搜索…

Android 一体机研发之修改系统设置————声音

Android 一体机研发之修改系统设置————屏幕亮度 Android 一体机研发之修改系统设置————声音 Android 一体机研发之修改系统设置————自动锁屏 修改系统设置系列篇章马上开张了&#xff01; 本章将为大家细节讲解声音。 对于声音功能大家都不陌生&#xff0c;在多…