专栏首页歪脖贰点零用Supervisor实现进程守护,在异常退出时自动重启

用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.

安装结束后,会有三个比较关键的执行文件:

  1. echo-supervisord-conf,默认生成supervisord.conf配置文件
  2. supervisord 启动等相关命令
  3. 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作测试,其它方案类似,有兴趣的朋友可以深入验证下。

本文分享自微信公众号 - 歪脖贰点零(growithus)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-09-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 学Python大半年——到底学会个啥?

    本来只是觉着按键精灵很鸡肋,很多功能实现不了,毕竟只是一门脚本语言,要做的牛还是要依赖很多其他的东西。

    Ed_Frey
  • Python——四则表达式(正则表达式的应用)

    依稀记得,n年前按键精灵等级考试时的题目:写一个四则运算的代码。当时其实离六级认证水平还有一定差距,愣是写了半个下午,才把不带括号的加减乘除给做出来(20分的题...

    Ed_Frey
  • Python—IF分支太多怎么办?

    Python的字典,是一个很神奇的东西,有人说,什么都可以装。可以装下整个宇宙?好像哪里有看到这么一段很霸气的文字。学习python的大半年时间...

    Ed_Frey
  • Python-选择结构程序设计

    最近愈发觉得时间紧迫,毕业后参加工作以来,按键精灵断断续续学习了好多年,属于三天打鱼两天晒网这种类型,所以高不成低不就。so,最近必须加快步伐,赶赶进度,不能在...

    Ed_Frey
  • Python—字符串常用的格式化方法

    其实如果要通读字符串的所有方法,只需要在pycharm中输入st.就会自动弹出字符串的方法列表,挨个试过去就知道了

    Ed_Frey
  • Python——字符串及函数的设计使用

    上期提到的廖雪峰的教程,很快就看过去了,前面一章的协程和异步io,看了三遍还是很懵逼,主要是运行测试时,执行步骤完全看不懂。再往后的实战章节呢,...

    Ed_Frey
  • Python——九九乘法表(While循环)

    徘徊了两个月,只好重新来过。看了一下专业培训的,上课大概就要上500小时+,我这短短几个月的酱油式填鸭,连100个小时都没凑?,接下来就简单的习题式的更新些帖子...

    Ed_Frey
  • Python——购物车程序(列表的应用)

    上面的代码,刚学完列表的时候写的,其实存在很多问题:比如商品、价格做到2个列表里,每次索引起来很麻烦,万一不小心价格顺序改一下,大厦直接坍塌,所以要做一个嵌套的...

    Ed_Frey
  • Python基础(二)基本数据类型

    Python跟Java不同的是,python的变量不需要声明,每个变量在使用前都必须赋值,变量赋值以后该变量才会被创建。在 Python 中,变量就是变量,它没...

    一觉睡到小时候
  • Python——神奇的闭包(装饰器的应用)

    Ed_Frey

扫码关注云+社区

领取腾讯云代金券