使用Supervisor进行监控进程并实现自动重启

本文介绍了进程守护系统的作用,特别是在服务器软件遇到难以重现的严重bug时的应用。重点讲解了Supervisor,一个基于Python的进程监控工具,如何通过心跳机制监控和重启进程,以及如何在Ubuntu上安装配置Supervisor,包括编辑配置文件、设置web管理界面和守护进程的实战应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.什么是进程守护系统?  

  进程守护系统,用于监控指定的进程,当发现目标进程不再正常工作时,就关闭该进程,并重启它。

  在什么情况下使用进程守护系统了?比如说,我们的某个服务器软件,在上线后出现一个严重的bug,该bug虽然很难出现,但是只要一出现,整个服务都会停掉(进程没有崩溃,只是不再提供服务)。此时,重启服务软件,又会开始正常工作。

  对于这样严重的bug,必须要查清楚并解决掉的。但是,基于以下两个原因:

  • 系统已经对用户开放,服务不能停。不可能说系统先下线,直到bug被解决掉后再重新上线。
  • bug很难重现,可能需要加日志,不断地跟踪排查,这很可能是一场持久战。

   为了让系统继续线上运行,在bug解决之前,必须要保证系统停止服务之后,能迅速重新启动恢复服务。此时,使用进程守护系统是最恰当不过的了。

   Supervisor就是为达到这一目的,实现了一个进程守护系统。一个守护者程序,可以守护同一台机器上的多个进程。Supervisor是一个基于Python开发的Linux系统上的进程监控工具。可以很方便的监听、启动、停止和重启一个或多个进程。通过 Supervisor 管理的进程,当进程意外被 Kill 时,Supervisor 会自动将它重启,可以很方便地做到进程自动恢复的目的,而无需自己编写 shell 脚本来管理进程。

 2.进程守护系统的实现及使用

   Supervisor守护者对被守护进程的管理使用的是心跳机制,其原理描述如下:

  1. 被守护进程定时向守护者报告(发送心跳),以表明自己是在正常提供服务。
  2. 如果守护者发现某个被守护进程连续一段时间都没有心跳过来,就关闭对应的进程,然后再启动对应的程序。

        在supervisor的配置⽂件中,把要管理的进程的可执行文件的路径写进去,通过配置command这个参数,把这些被管理的进程当作supervisor的子进程来启动,获取到该进程的pid,然后再对该pid进行监控,当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息,可以选择是否⾃⼰启动和报警。

3. 安装配置Supervisor

#Ubuntu安装Supervisor
apt install -y supervisor
#supervisor开机自启:
systemctl enable supervisor
# 开始运行
systemctl start supervisor
# 查看supervisord服务状态
systemctl status supervisord 
# 查看是否存在supervisord进程
ps -aux|grep supervisord    

编辑配置文件
vim /etc/supervisord.conf,增加如下内容,以方便使用web页面查看被守护进程的信息及操作。

[inet_http_server]        #HTTP服务器,提供web管理界面
port=0.0.0.0:9001         #Web管理后台运行的IP和端口,云服务器注意开放该端口
username=admin            #登录管理后台的用户名
password=admin            #登录管理后台的密码

添加一个被守护进程的配置文件

#以test为例
cd /etc/supervisor/conf.d/
#创建开机启动脚本配置文件
touch test.conf
#编辑/etc/supervisor/conf.d/test.conf
vim /etc/supervisor/conf.d/test.conf

内如如下:

[program:api]
#执行文件的路径
directory=/home/ok/test/
#执行的命令
command=bash test.sh
#随supervisor启动
autostart = true
#启动10秒后没有异常退出,就表示进程正常启动
startsecs = 10
#程序退出后自动重启
autorestart = true
#启动失败自动重试次数
startretries = 2
#执行命令的用户
user = ok
#用来杀死进程的信号
stopsignal=KILL               
#日志路径
stdout_logfile=/home/ok/test/tornado_16018.log

因为supervisor已经被设置成了开机自启动,而这里,我们又设置了test.sh随着supervisor而自启动。test.sh的内容如下:

#!/bin/bash
#echo "hello world"
sleep 10
cd /home/ok/test/
./a.out
#也可以是./a.out &

其中a.out是我们写的测试程序,主要是测试stl的map的插入与查询功能;

验证

重启电脑后,使用web页面查看守护进程工作情况。浏览器访问IP地址端口

http://0.0.0.0:9001

在这里插入图片描述
已经开始运行并监控,如果进程挂掉将重启,但是supervisor不支持跨机器的进程监控,一个supervisord只能监控本机上的程序,大大限制了supervisor的使用。

 查看pstree,supvervisor确实是1号进程的子进程。

 我们使用kill -9 pid的方式杀掉a.out后,supervisor确实会再启动一个a.out,这可以可以通过日志查看。

 这里面,supervisor首页显示的pid实际是test.sh对应的进程id,而日志里面的是a.out对应的进程id。

通过上述测试过程,我们发现,supervisor除了可以监控进程外,其实还可以把某个程序设置为开机启动。

注意,这里面如果要求用户的程序在全局只能有1份同时在运行,那么脚本里面还需要增加其他的内容,例如判断当前进程列表里面是否已经存在该进程,如果存在,则不再启动,否则则启动。相关内容可以参考:linux 进程(关于守护进程、检查一个进程是否活着、如何写一个进程号文件)_andylauren的博客-CSDN博客

有了supervisor之后我们可以直接借助它来实现我们的守护进程,而不用再像创建守护进程为什么要fork两次_TerryZjl的博客-CSDN博客_守护进程fork两次介绍的那样来回折腾。
参考链接:https://blog.csdn.net/weixin_46415378/article/details/124229507

### 回答1: MQTT(Message Queuing Telemetry Transport)是一种轻量级的通信协议,适用于物联网设备间的通信。单片机编程是指通过编程技术将MQTT协议应用到单片机中,实现单片机与云平台或其他设备的通信。 在实施MQTT单片机编程时,我们可以借助各种工具和技术来简化开发流程。技术方面,我们需要掌握单片机的指令集和编程语言,常用的有C语言和汇编语言。此外,还需要了解MQTT协议的工作原理和相关的API函数,以及如何与单片机的硬件进行配合。 在选择工具方面,可以使用一些开源的MQTT库,如Paho MQTT和PubSubClient等,这些库提供了丰富的函数和接口,可以方便地用于单片机编程。此外,还可以使用一些集成开发环境(IDE)和调试工具,如Keil、IAR等,这些工具提供了一体化的开发环境和调试功能,能够加快开发效率和提高代码的可靠性。 在进行MQTT单片机编程时,需要注意以下几点。首先,需要确保单片机的硬件和网络环境能够支持MQTT协议,例如需要有网络模块和相关硬件接口。其次,需要合理设计和实现消息的发布和订阅机制,以满足实际应用需求。此外,还需要考虑消息的传输安全性和稳定性,可以通过加密、认证等手段来保护消息的机密性和完整性。 总的来说,MQTT单片机编程是一项复杂而重要的工作,需要掌握相关的技术和工具,合理设计和实现通信机制,确保通信的可靠性和安全性。这对于物联网应用的开发和应用场景的实现都具有重要意义。 ### 回答2: MQTT(Message Queuing Telemetry Transport,消息队列遥测传输)是一种基于发布-订阅模式的轻量级通信协议。MQTT协议适用于在低带宽、不稳定连接或网络条件不理想的情况下进行通信。 单片机编程是指使用单片机进行嵌入式系统开发的过程。单片机是一种集成了处理器、存储器和各种外围设备接口的微型计算机,可用于控制和监测各种电子设备。 工具技小新是一款面向单片机编程的开发工具。它提供了一系列功能和工具,帮助开发人员更加方便地进行单片机程序的编写、调试和测试。 在使用MQTT进行单片机编程时,可以通过工具技小新来简化开发流程。首先,可以利用工具技小新提供的MQTT库来实现MQTT协议的功能。该库可以支持MQTT协议的连接、发布消息和订阅主题等操作。 其次,工具技小新还提供了一系列开发工具,如编译器、调试器和仿真器等。这些工具可以帮助开发人员进行代码的编译、调试和测试,确保程序的正确性和稳定性。 此外,工具技小新还提供了丰富的示例代码和文档,供开发人员参考和学习。通过这些资源,开发人员可以更快地上手MQTT编程,加快开发进度。 总之,MQTT单片机编程工具技小新是一种便捷的工具,可以在单片机编程过程中提供MQTT协议的支持,简化开发流程,加快开发进度。通过使用该工具,开发人员可以更好地实现单片机与其他设备间的通信和控制。 ### 回答3: MQTT是一种轻量级的通信协议,适用于物联网设备之间的数据交互。单片机编程是指使用单片机进行程序开发,通常用于控制小型嵌入式系统的硬件操作。工具技小新是一种单片机编程工具,提供了简洁的编程界面和丰富的功能库,便于开发人员快速开发和调试单片机程序。 在使用MQTT进行单片机编程时,我们可以使用工具技小新提供的MQTT库来实现与MQTT代理服务器之间的通信。首先,我们需要在单片机上配置网络连接,以便与MQTT服务器进行通信。工具技小新提供了简单易用的网络配置功能,可以通过设置WiFi或以太网连接来实现。 一旦网络连接成功建立,我们就可以使用工具技小新提供的MQTT库来进行通信。我们可以定义需要发布和订阅的主题(Topic),使用内置的函数来发送和接收消息。发送消息的函数可以将单片机上的传感器数据发送到MQTT服务器,接收消息的函数可以接收来自其他设备的消息,根据需要进行相应的操作。 在单片机编程中,我们还可以使用工具技小新提供的其他功能丰富和简化开发过程。例如,它提供了许多常用的硬件控制函数,例如控制IO口和PWM输出等,以便于与外部设备进行交互。此外,工具技小新还提供了调试功能,可以帮助我们对程序进行错误排查和性能优化。 总而言之,MQTT单片机编程需要使用一种支持MQTT协议的单片机编程工具。工具技小新是一种方便易用的工具,提供了MQTT库和其他丰富的功能,可帮助开发人员快速开发和调试单片机程序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值