zoukankan      html  css  js  c++  java
  • 用Supervisor实现进程守护,在异常退出时自动重启

    程序启动后,有些是以daemon的形式运行,但在意外退出后,如果不能及时重新启动,会有比较严重的影响。

    比如Zimg在图片处理中由于某些图片处理失败,会导致zimg进程挂掉,影响正常的服务提供,并且只能在服务失效后才能察觉到。必须采用一个进程守护来时刻保证zimg进程挂掉后,再自动重新启动。本篇介绍Supervisor工具来进行Zimg进程的守护。

    Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。

    安装过程如下:

    
     
    1. [root@localhost ~]# pip3 install supervisor

    2. Collecting supervisor

    3.  Using cached https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz

    4.    Complete output from command python setup.py egg_info:

    5.    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)

    6.    [GCC 4.8.5 20150623 (Red Hat 4.8.5-11)].  Please install using a supported version.

    7.    ----------------------------------------

    8. Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-15pcy5f3/supervisor/

    9. You are using pip version 8.1.1, however version 18.0 is available.

    10. You should consider upgrading via the 'pip install --upgrade pip' command.

    提示显示,python 3版本下,没办法正常安装Supervisor,只能先将python 3删除掉,再安装Supervisor。采用rm -rf xxxxx命令删除即可。

    
     
    1. [root@localhost ~]# whereis python

    2. 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。

    
     
    1. [root@wfm ~]# yum -y install pip

    2. Loaded plugins: fastestmirror, refresh-packagekit, security

    3. Loading mirror speeds from cached hostfile

    4. * base: mirrors.tuna.tsinghua.edu.cn

    5. * extras: mirrors.tuna.tsinghua.edu.cn

    6. * updates: mirrors.tuna.tsinghua.edu.cn

    7. Setting up Install Process

    8. No package pip available.

    9. 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)

    
     
    1. [root@localhost bin]# pip install supervisor

    2. Collecting supervisor

    3.  Using cached https://files.pythonhosted.org/packages/44/60/698e54b4a4a9b956b2d709b4b7b676119c833d811d53ee2500f1b5e96dc3/supervisor-3.3.4.tar.gz

    4. Collecting meld3>=0.6.5 (from supervisor)

    5.  Downloading https://files.pythonhosted.org/packages/b6/ae/e6d731e4b9661642c1b20591d8054855bb5b8281cbfa18f561c2edd783f7/meld3-1.0.2-py2.py3-none-any.whl

    6. Installing collected packages: meld3, supervisor

    7.  Running setup.py install for supervisor ... done

    8. Successfully installed meld3-1.0.2 supervisor-3.3.4

    9. You are using pip version 8.1.2, however version 18.0 is available.

    10. 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作测试,其它方案类似,有兴趣的朋友可以深入验证下。

    扩展阅读:

    长按2秒,识别二维码,关注我。

    关注程序员成长

    成长的乐趣,在于分享!
    大龄程序员,一路走来,感慨颇多。闲暇时写写字,希望能给同行人一点帮助。
    本文版权归作者growithus和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    error LNK2019: 无法解析的外部符号 _WinMain@16,该符号在函数 ___tmainCRTStartup 中被引用
    unity官方换装教程Character Customization 学习笔记
    python中执行os.system(),程序处于堵塞状态,debug报pydev debugger: process 11152 is connecting
    python中安装pywinauto成功,执行时报如下错误的解决办法
    jmeter之Ramp-up Period(in seconds)
    jmeter之HTTP信息管理器、正则表达式联合使用(获取登录session
    linux之crontab定时器
    python之删除指定目录指定日期下的日志文件
    python2含有中文路径报错解决办法[xe4xbfxa1xe6x81xaf]
    性能测试之指标参考标准
  • 原文地址:https://www.cnblogs.com/growithus/p/11012157.html
Copyright © 2011-2022 走看看