用Supervisor实现进程守护,在异常退出时自动重启
程序启动后,有些是以daemon的形式运行,但在意外退出后,如果不能及时重新启动,会有比较严重的影响。
比如Zimg在图片处理中由于某些图片处理失败,会导致zimg进程挂掉,影响正常的服务提供,并且只能在服务失效后才能察觉到。必须采用一个进程守护来时刻保证zimg进程挂掉后,再自动重新启动。本篇介绍Supervisor工具来进行Zimg进程的守护。
Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。
安装过程如下:
[root@localhost ~]# pip3 install supervisor
Collecting supervisor
Using cached https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz
Complete output from command python setup.py egg_info:
Supervisor requires Python 2.4 or later but does not work on any version of Python 3. You are using version 3.5.2 (default, Jan 9 2017, 16:42:56)
[GCC 4.8.5 20150623 (Red Hat 4.8.5-11)]. Please install using a supported version.
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-15pcy5f3/supervisor/
You are using pip version 8.1.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
提示显示,python 3版本下,没办法正常安装Supervisor,只能先将python 3删除掉,再安装Supervisor。采用rm -rf xxxxx命令删除即可。
[root@localhost ~]# whereis python
python: /usr/bin/python /usr/bin/python2.7 /usr/bin/python2.7-config /usr/lib/python2.7 /usr/lib64/python2.7 /etc/python /usr/local/bin/python3.5m /usr/local/bin/python3.5 /usr/local/bin/python3.5m-config /usr/local/bin/python3.5-config /usr/local/lib/python3.5 /usr/include/python2.7 /usr/share/man/man1/python.1.gz
删除后,继续采用pip命令来安装Supervisor。
[root@wfm ~]# yum -y install pip
Loaded plugins: fastestmirror, refresh-packagekit, security
Loading mirror speeds from cached hostfile
* base: mirrors.tuna.tsinghua.edu.cn
* extras: mirrors.tuna.tsinghua.edu.cn
* updates: mirrors.tuna.tsinghua.edu.cn
Setting up Install Process
No package pip available.
Error: Nothing to do
解决方法:需要先安装扩展源EPEL。
EPEL(http://fedoraproject.org/wiki/EPEL) 是由 Fedora 社区打造,为 RHEL 及衍生发行版如 CentOS、Scientific Linux 等提供高质量软件包的项目。
首先安装epel扩展源:
yum -y install epel-release
然后再安装pip
yum -y install python-pip --安装成功后,简单测试下pip命令是否生效 [root@localhost bin]# pip -V pip 8.1.2 from /usr/lib/python2.7/site-packages (python 2.7)
[root@localhost bin]# pip install supervisor
Collecting supervisor
Using cached https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz
Collecting meld3>=0.6.5 (from supervisor)
Downloading https://files.pythonhosted.org/packages/b6/ae/e6d731e4b9661642c1b20591d8054855bb5b8281cbfa18f561c2edd783f7/meld3-1.0.2-py2.py3-none-any.whl
Installing collected packages: meld3, supervisor
Running setup.py install for supervisor ... done
Successfully installed meld3-1.0.2 supervisor-3.3.4
You are using pip version 8.1.2, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
安装结束后,会有三个比较关键的执行文件:
echo-supervisord-conf,默认生成supervisord.conf配置文件
supervisord 启动等相关命令
supervisorctl 交互等相关命令
下一步进行Supervisor开启的一个进程守护测试工作,以上篇Zimg为例。(Zimg—轻量级图片服务器搭建利器)
[root@localhost ~]# mkdir /etc/supervisor/ [root@localhost ~]# echo_supervisord _conf > /etc/supervisor/supervisord.conf -- 生成一个比较全面的示例文件,稍加修改就可以使用。
详细的配置说明,参考网络资料,这里不再赘述。
配置zimg的program,同时配置inet_http_server可以通过UI来管理应用,
[root@localhost ~]# supervisord -c /etc/supervisor/supervisord.conf 启动Supervisor [root@localhost ~]# supervisorctl reload 配置文件有变动后,重新加载Supervisor
启动后,发现Zimg并没有如理想般加载起来,查看日志发现如下错误
由于zimg的配置文件中,默认配置is_daemon=1,这里如果采用supervisor的话,需要将配置daemon值设为0,交由supervisor来接管。
重新启动,显示如下图:
可以发现,在kill掉或pkill掉进程后,zimg程序依旧正常运转。也可以在UI界面上看到进程的运行状态:
后记
类似的组件,也到网络中检索一翻,能实现相关功能有基于nodejs实现的几种方案,如pm2、supervisor、forever等等,本例仅以Supervisor作测试,其它方案类似,有兴趣的朋友可以深入验证下。
扩展阅读:
长按2秒,识别二维码,关注我。
关注程序员成长
用Supervisor实现进程守护,在异常退出时自动重启的更多相关文章
- java实现创建临时文件然后在程序退出时自动删除文件(转)
这篇文章主要介绍了java实现创建临时文件然后在程序退出时自动删除文件,从个人项目中提取出来的,小伙伴们可以直接拿走使用. 通过java的File类创建临时文件,然后在程序退出时自动删除临时文件.下面 ...
- Google Chrome 怎么在退出时自动删除历史记录
1 Google Chrome 怎么在退出时自动删除历史记录 https://chrome.google.com/webstore/detail/clickclean/ghgabhipcejejjmh ...
- window下进程退出后自动重启
设计思想:编写批处理脚本监控进程的运行状态,如果发现进程停止,则自动重启该进程.批处理脚本(jk.bat)和进程脚本(hello.bat)如下: 1.jk.bat @echo off rem 定义需监 ...
- 神奇的bug,退出时自动更新时间
遇到一个神奇的bug,用户退出时,上次登录时间会变成退出时的时间. 于是开始跟踪,发现Laravel在退出时,会做一次脏检查,这时会更新rember_token,这时就会有update操作如下. 而粗 ...
- 在linux下python爬虫进程发生异常时自动重启直至正常结束的方法
之前在做爬虫的时候遇到一种情况,当网络情况不太好的时候,爬虫爬到的链接在urlopen时会因为无法正常连接而报URLError或者timeout的错误导致陈序报错而终止:但是这些错误在重新运行陈序后能 ...
- shell检查网络出现异常、僵尸进程、内存过低后,自动重启
#!/bin/bash while : do neterror=$(/bin/netstat -a | grep -cw "CLOSE_WAIT") echo "get ...
- 使用supervisor管理进程
Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,可以很方便的用来启动.重启.关闭进程(不仅仅是 Python 进程).除了对单个进程的 ...
- Django与supervisor 管理进程
1.前言 在Django项目中,我们需要用到一些独立于Django框架外的脚本.这样一些脚本可能需要独立的持续运行,且具有很强的可维护性,这个时候supervisor就可以排上用场了. 基于pytho ...
- supervisor管理进程工具配置
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...
随机推荐
- 重写combobox模板,实现支持过滤的combobox
先看效果图 客户提出需求后,首选在百度查找可靠方案 看了几个,效果都不理想, 大多是把isEditNable设置成true,IsTextSearchNable设置成false 再对itemsSourc ...
- HTML5离线缓存攻击测试
本实验采用局域网模拟,通过修改本地HOSTS文件来模拟域名以及DNS欺骗.合法网站使用Linux CentOS7的apache服务器搭建,IP为192.168.1.113,HOSTS文件中加入192. ...
- Windows10 【系统周期表】【系统下载表】【大型软件表】
系统周期表 商用名称 商用英文名 代号 版本 系统版本 上市日期 服务周期 备注 Windows 10 无 Threshold 1 1507 10.0.10240.17443 2015.07.29 2 ...
- JavaScript生成树形菜单(递归算法)
1.最终效果图(这里仅为实现算法,并加载至页面,不做任何css界面优化) 注释:本示例包含三级目录菜单,但实际上可支持N级(可使用该代码自行测试) 2.数据源 菜单信息一般来源于数据库中数据表,且为自 ...
- Unicode 7.0.1中文支持非常好
简单测试了一下,7.0.1中文支持非常好.Delphi7下将UniConnection的useUnicode设置为False,Tokyo下设置为True,Charset空着即可. 问题要点:1.建数据 ...
- Qt系统对话框中文化及应用程序实现重启及使用QSS样式表文件及使用程序启动界面
一.应用程序中文化 1).Qt安装目录下有一个目录translations/,在此目录下有qt_zh_CN.ts和 qt_zh_CN.qm把它们拷贝到你的工程目录下. 2).在main函数加入下列代码 ...
- QObject提供了QMetaObject元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化
元类信息(相当于RTTI和反射),信号与连接,父子关系,调试信息,属性,事件,继承关系,窗口类型,线程属性,时间器,对象名称,国际化其中元类又提供了:classInfo,className,构造函数, ...
- Aria2在Windows上如何安装配置使用
一.下载所需的软件 二.安装与使用 三.Aria2的额外内容 四.Aria2的使用 五.Aria2与其它插件配合使用 一.下载所需的软件 可以从一下地址获取最新版本 GitHub: https://g ...
- sql 日志恢复
可能有不少朋友遇到过这样的问题: update或delete语句忘带了where子句,或where子句精度不够,执行之后造成了严重的后果,这种情况的数据恢复只能利用事务日志的备份来进行,所以如果你的S ...
- 3011C语言_基础知识
第一章 基础知识 1.1 基本框架 //任何一个c语言程序都必须包括以下格式: int main(int argc, char *argv[] ) { : } //这是c语言的基本结构,任何一个程 ...