Supervisor: 进程控制系统

概述:Supervisor是一个 Client/Server模式的系统,允许用户在类unix操作系统上监视和控制多个进程,或者可以说是多个程序。

它与launchddaemontoolsrunit等程序有着相同的功能,与其中某些程序不同的是,它并不作为“id 为 1的进程”而替代init。相反,它用于控制应用程序,像启动其它程序一样,通俗理解就是,把Supervisor服务管理的进程程序,它们作为supervisor的子进程来运行,而supervisor是父进程。supervisor来监控管理子进程的启动关闭和异常退出后的自动启动。

一、Supervisor与系统自带init 进程管理比较

方便:有些编译运行的程序,在安装完成后,需要为他们编写启动停止管理脚本,写入和维护可能很痛苦,而且进程在异常崩溃结束时,许多程序都不会正确重新启动的。Supervisord启动管理的程序进程是作为其子进程来运行的,并且可以配置为在进程崩溃停止时自动重新启动它们。

准确:在Unix上的进程通常很难获得准确的up/down状态。Pidfiles经常说谎。Supervisord将进程作为子进程启动,所以它总是知道其子进程的正确的up/down状态,可以方便的对这些数据进行查询

进程分组:进程支持分组启动和停止,也支持启动顺序,即‘优先级’,supervisor允许为进程分配优先级,并允许用户通过supervisorctl客户端发出命令,如“全部启动”和”重新启动所有“,它们以预先分配的优先级顺序启动。还可以将进程分为”进程组“,一组逻辑关联的进程可以作为一个单元停止或启动。

Supervisor的特点:

简单:supervisor通过简单的INI风格的配置文件进行配置管理,易于学习,并提供了许多每个进程选项,如重新启动失败的进程和日志的自动切割。

集中:supervisor提供一个start、stop和监控进程的地方,进程可以单独或分组进行控制。可以通过supervisor的本地或远程命令行管理和web管理(一般为了安全,web通常需要禁用)

高效:supervisor通过fork/exec启动子进程,子进程需要前台运行,操作系统进程终止时去通知supervisor,而不像一些我们需要写脚本去定期轮询PID文件来重新启动失败的进程。

可扩展:supervisor有一个简单的事件(event)通知协议,还有一个用于控制的XML-RPC接口,可以用Python开发人员来扩展构建。

兼容:supervisor由Python编写,在除Windows操作系统以外基本都支持,如linux,Mac OS x,solaris,FreeBSD系统

Supervisor的组建构成

Supervisord:supervisor服务器的进程名是supervisord。它主要负责在自己的调用中启动子程序,响应客户端的命令,重新启动崩溃或退出的进程,记录其子进程stdout和stderr的输出,以及生成和处理对应于子进程生命周期中的”event“

服务器进程使用的配置文件,通常路径存放在/etc/supervisord.confa中。此配置文件是INI格式的配置文件。

supervisorctl:supervisor命令行的客户端名称是supervisorctl。它为supervisord提供了一个类似于shell的交互界面。使用supervisorctl,用户可以查看不同的supervisord进程列表,获取控制子进程的状态,如停止和启动子进程

web服务器:一个可以通过Web界面来查看和控制进程的状态,默认监听在9091上。

二、Supervisord的安装配置

1.安装

安装分为有网络安装和无网络安装,由于无网络安装环节需要在有网络的主机上进行依赖包下载,所以相对繁琐麻烦,如果本机没有网络,可以考虑使用squid代理来进行安装,本文介绍的是有网络安装。

安装命令可以使用easy_install supervisor或者 pip install supervisor 或者去pypi官网上下载最新版本进行解压安装。也可以使用yum或者apt,但不保证是最新版本。

我这里使用的是pip方式来安装。默认系统里是没有pip python包管理程序的,先来安装下pip吧。更新下yum 源

# curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-6.repo

下载pip安装脚本并直接安装

# curl -o /tmp/get-pip.py https://bootstrap.pypa.io/get-pip.py && python /tmp/get-pip.py

安装今天的猪脚supervisor程序

# pip install supervisor

2.生成配置文件

用supervisor自带命令生成一个标准的配置文件

/usr/bin/echo_supervisord_conf > /etc/supervisord.conf

遇到的故障 1:如果在这生成配置文件时,遇到以下故障:

 ~]# echo_supervisord_conf > /etc/supervisord.conf
Traceback (most recent call last):
File "/usr/bin/echo_supervisord_conf", line , in <module>
from pkg_resources import load_entry_point
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line , in <module>
working_set.require(__requires__)
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line , in require
needed = self.resolve(parse_requirements(requirements))
File "/usr/lib/python2.6/site-packages/pkg_resources.py", line , in resolve
raise DistributionNotFound(req)
pkg_resources.DistributionNotFound: meld3>=0.6.

解决:检查你的meld3版本有没有安装,另外安装时,不要使用最新的版本(在本文发表之前一直最新版本是meld3-1.0.2),可以安装除1.0.2之前的并且大于0.6.5的版本,使用

pip命令检查当前的meld3版本,可以看到当前版本默认安装了最新版1.0.2

 ~]# pip list
distribute (0.6.)
iniparse (0.3.)
meld3 (1.0.)
pip (9.0.)
pycurl (7.19.)
pygpgme (0.1)
setuptools (.6rc11)
supervisor (3.3.)
urlgrabber (3.9.)
yum-metadata-parser (1.1.)

先卸载当前meld3,之后用pip install 安装指定版本即可,如下:

 ~]# pip uninstall meld3
~]# pip install meld3==1.0.

然后再运行第1部分处生成配置文件的命令。
本文属于原创文章,码字辛苦,转载前请注明出处,飞走不可Supervisor: 进程控制系统http://www.cnblogs.com/hanyifeng/p/6728151.html

3. 这里穿插下supervisor 和supervisorctl命令使用的配置文件含义

 ~]# cat /etc/supervisord.conf
; Sample supervisor config file.
;
; For more information on the config file, please see:
; http://supervisord.org/configuration.html
;
; Notes:
; - Shell expansion ("~" or "$HOME") is not supported. Environment
; variables can be expanded using this syntax: "%(ENV_HOME)s".
; - Comments must have a leading space: "a=b ;comment" not "a=b;comment". [unix_http_server]
file=/tmp/supervisor.sock ; (socket 文件的路径)
;chmod= ; socket 文件权限 (default )
;chown=nobody:nogroup ; socket 文件属主:属组
;username=user ; (启动http的用户 (open server))
;password= ; (默认的密码 (open server)) ;[inet_http_server] ; 默认禁用tcp监听的http 服务
;port=127.0.0.1: ; (指定监听在本机ip地址和端口)
;username=user ; (默认启动http服务的用户)
;password= ; (默认的密码) [supervisord]
logfile=/tmp/supervisord.log ; (主日志文件的存放位置,默认在程序的工作启动目录)
logfile_maxbytes=50MB ; (主日志文件的最大值,之后进行切割;默认 50MB)
logfile_backups= ; (主日志文件备份的数目;默认 )
loglevel=info ; (日志级别;默认是info; 其它: debug,warn,trace)
pidfile=/tmp/supervisord.pid ; (supervisord 运行时的pidfile路径;默认 supervisord.pid)
nodaemon=false ; (如果为true,程序就以前台运行;默认是 false)
minfds= ; (min. 启动有效的文件描述符数目;默认 )
minprocs= ; (min. 有效进程描述符;默认 )
;umask= ; (进程文件创建的默认权限;默认 )
;user=chrism ; (默认是当前启动的用户)
;identifier=supervisor ; (supervisord 标识符, 默认是'supervisor')
;directory=/tmp ; (默认启动时间不会切换)
;nocleanup=true ; (在启动时不清理临时文件;默认值为false)
;childlogdir=/tmp ; ('AUTO' 子进程日志目录, 默认 $TEMP)
;environment=KEY="value" ; (增加一个环境变量键值对:key=”value“)
;strip_ansi=false ; (在log日志里去掉ansi转义编码; 默认是 false) ; 下面的部分选项必须保留在RPC的配置文件中
; (supervisorctl/web 接口) 使用以下配置来管理
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl]
serverurl=unix:///tmp/supervisor.sock ; use a unix:// URL for a unix socket
;serverurl=http://127.0.0.1:9001 ; use an http:// url to specify an inet socket
;username=chris ; should be same as http_username if set
;password= ; should be same as http_password if set
;prompt=mysupervisor ; cmd line prompt (default "supervisor")
;history_file=~/.sc_history ; use readline history if available ; 以下是被管理的示例程序显示所有可能用到的配置。
; 创建一个或“多个”程序: 要遵循以下的键值对规则。
; supervisor. ;[program:theprogramname]
;command=/bin/cat ; 程序的启动命令 (使用绝对路径)
;process_name=%(program_name)s ; process_name 表示 (默认是 %(program_name)s)
;numprocs= ; 启动时的进程数 (默认 )
;directory=/tmp ; 执行时切换到的目录 (def no cwd)
;umask= ; umask for process (default None)
;priority= ; 相对启动优先级(default )
;autostart=true ; 是否跟随supervisord程序启动该监控程序 (default: true)
;startsecs= ; # 在设定时间内,程序必须保持运行 (def. )
;startretries= ; 当启动失败时尝试的最大次数(default )
;autorestart=unexpected ; 如果退出后,什么状态退出的去重启,默认非意外的(def: unexpected)
;exitcodes=, ; 'expected' 符合退出代码之后去重启 (default ,)
;stopsignal=QUIT ; 用于杀死进程的信号 (default TERM)
;stopwaitsecs= ; 最大等待秒数 SIGKILL (default )
;stopasgroup=false ; 发送停止信号到Unix进程组 (default false)
;killasgroup=false ; SIGKILL UNIX进程组 (def false)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=true ; 是否开启程序标准错误输出的重定向 (default false)
;stdout_logfile=/a/path ; 标准输出路径; default AUTO
;stdout_logfile_maxbytes=1MB ; 文件最大大小 # 日志文件进行切割 (default 50MB)
;stdout_logfile_backups= ; # 日志文件备份数目 (default )
;stdout_capture_maxbytes=1MB ; ‘捕获模式’中的字节数 (default )
;stdout_events_enabled=false ; 在标准输出写入文件时发出事件 (default false)
;stderr_logfile=/a/path ; 标准错误输出, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; 文件最大大小 # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups= ; # of stderr logfile backups (default )
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default )
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A="",B="" ; 添加进程环境变量 (def no adds)
;serverurl=AUTO ; 覆盖serverurl计算 (childutils) ;下面是event事件部分所有可能设置的值,大部分同上面一样。
; eventlistener subsection values, create one or more 'real'
; eventlistener: sections to be able to handle event notifications
; sent by supervisor. ;[eventlistener:theeventlistenername]
;command=/bin/eventlistener ; the program (relative uses PATH, can take args)
;process_name=%(program_name)s ; process_name expr (default %(program_name)s)
;numprocs= ; number of processes copies to start (def )
;events=EVENT ; event notif. types to subscribe to (req'd)
;buffer_size= ; event buffer queue size (default )
;directory=/tmp ; directory to cwd to before exec (def no cwd)
;umask= ; umask for process (default None)
;priority=- ; the relative start priority (default -)
;autostart=true ; start at supervisord start (default: true)
;startsecs= ; # of secs prog must stay up to be running (def. )
;startretries= ; max # of serial start failures when starting (default )
;autorestart=unexpected ; autorestart if exited after running (def: unexpected)
;exitcodes=, ; 'expected' exit codes used with autorestart (default ,)
;stopsignal=QUIT ; signal used to kill process (default TERM)
;stopwaitsecs= ; max num secs to wait b4 SIGKILL (default )
;stopasgroup=false ; send stop signal to the UNIX process group (default false)
;killasgroup=false ; SIGKILL the UNIX process group (def false)
;user=chrism ; setuid to this UNIX account to run the program
;redirect_stderr=false ; redirect_stderr=true is not allowed for eventlisteners
;stdout_logfile=/a/path ; stdout log path, NONE for none; default AUTO
;stdout_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stdout_logfile_backups= ; # of stdout logfile backups (default )
;stdout_events_enabled=false ; emit events on stdout writes (default false)
;stderr_logfile=/a/path ; stderr log path, NONE for none; default AUTO
;stderr_logfile_maxbytes=1MB ; max # logfile bytes b4 rotation (default 50MB)
;stderr_logfile_backups= ; # of stderr logfile backups (default )
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A="",B="" ; process environment additions
;serverurl=AUTO ; override serverurl computation (childutils) ; The below sample group section shows all possible group values,
; create one or more 'real' group: sections to create "heterogeneous"
; process groups. ;[group:thegroupname]
;programs=progname1,progname2 ; 这里的progname1,progname2就是定义的监控管理程序的名字,如[program:x]这里就是x
;priority= ; the relative start priority (default ) ; 下面的 [include] 选项只能包含一个files 设置,功能是定义supervisor管理程序的配置文件,可以单独的移除去,和主配置文件分开,方便。
; setting can list multiple files (separated by whitespace or
; newlines). It can also contain wildcards. The filenames are
; interpreted as relative to this file. Included files *cannot*
; include files themselves. ;[include]
;files = relative/directory/*.ini ;定义管理监控程序的配置文件的路径

4.创建supervisor 存放监控程序的目录,并修改supervisod.conf文件

~]# mkdir -pv /etc/supervisor/config.d

修改supervisord 主程序文件,可以

sed -i '$ a [include]' /etc/supervisord.conf
sed -i '$ a files = /etc/supervisor/config.d/*.ini' /etc/supervisord.conf

5.然后拷贝以下supervisor程序的 启动停止控制脚本内容到init.d下,并赋予执行权限。脚本内容如下:

#!/bin/sh
#
# /etc/init.d/supervisord
#
# Supervisor is a client/server system that
# allows its users to monitor and control a
# number of processes on UNIX-like operating
# systems.
#
# chkconfig: -
# description: Supervisor Server
# processname: supervisord
# config: /etc/supervisord.conf
# pidfile: /var/run/supervisord.pid # Source init functions
. /etc/rc.d/init.d/functions prog="supervisord" prefix="/usr/"
exec_prefix="${prefix}"
prog_bin="${exec_prefix}/bin/supervisord"
PIDFILE="/var/run/$prog.pid" start()
{
echo -n $"Starting $prog: "
daemon $prog_bin -c /etc/supervisord.conf --pidfile $PIDFILE
[ -f $PIDFILE ] && failure $"$prog startup" || success $"$prog startup"
echo
} stop()
{
echo -n $"Shutting down $prog: "
[ -f $PIDFILE ] && killproc $prog || success $"$prog shutdown"
echo
} case "$1" in start)
start
;; stop)
stop
;; status)
status $prog
;; restart)
stop
start
;; *)
echo "Usage: $0 {start|stop|restart|status}"
;; esac

6.设置tomcat的配置文件和guacd的配置文件,存放到之前设置的文件存放目录/etc/supervisor/config.d/.,

tomcat.ini

#!/usr/bin/python
[program:tomcat]
command=/usr/share/tomcat/bin/catalina.sh run
stdout_logfile=/var/log/tomcat/catalina.out
stdout_logfile_maxbytes=20MB
autostart=true
autorestart=true
startsecs=
priority=
stopasgroup=true
killasgroup=true

guacd.ini

#!/usr/bin/python
[program:guacd]
command=/usr/local/sbin/guacd -b 0.0.0.0 -l -p /var/run/guacd.pid -f
stdout_logfile=/var/log/guacd/guacd.log
stdout_logfile_maxbytes=100MB
user=root
autostart=true
autorestart=true
startsecs=
priority=
stopasgroup=true
killasgroup=true

根据guacd 程序的配置,需要给其创建一个程序的日志目录。

~]# mkdir /var/log/guacd

7.将原有的服务,从daemon方式停止掉,并禁止开机自启动。让supervisor来管理服务

 ~]# service tomcat stop
~]# service guacd stop
~]# chkconfig tomcat off
~]# chkconfig guacd off

8.启动supervisor 程序,

]# /etc/init.d/supervisord start
Starting supervisord: [ OK ]

这时没问题的话,tomcat服务和guacd服务已经由supervisord父进程来控制了。可以使用supervisorctl 客户端命令来交互检查服务运行

 ~]# supervisorctl
guacd RUNNING pid , uptime ::
tomcat RUNNING pid , uptime ::

也可以使用命令行里试用supervisorctl 来检查控制被监控进程

 ~]# supervisorctl status tomcat
tomcat RUNNING pid , uptime ::
~]# supervisorctl stop tomcat
tomcat: stopped
~]# supervisorctl status tomcat
tomcat STOPPED Apr : PM

9.测试验证进程是否自动守护

先检查下guacd服务的运行状态

~]# supervisorctl status guacd
guacd RUNNING pid , uptime ::

之后手动杀死该进程

~]# kill 

间隔几秒钟,程序就会自动启动该程序。按设定的应该是5秒。可以设置2~5秒。

~]# supervisorctl status guacd
guacd RUNNING pid , uptime ::

从上面可以看到,supervisord程序很快的启动了一个guacd的进程。guacd服务也很快恢复到正常状态。

三、总结

  supervisor程序的特性就是可以很好的控制我们的一些前端运行(不是以dameon方式运行的)的程序,或者说该程序在运行时不稳定,有会被异常杀死的情况(可能是内存泄漏,可能是异常崩溃,等其他问题),通过使用supervisor来管理监控程序的运行,当失败的时候,自动启动服务。

  文中如有错误之处,还望大家及时指出。也欢迎大家在留言区交流哈。

本文属于原创文章,码字辛苦,转载前请注明出处,飞走不可Supervisor: 进程控制系统http://www.cnblogs.com/hanyifeng/p/6728151.html

参考链接:

http://supervisord.org/index.html

Supervisor: A Process Control System的更多相关文章

  1. RH033读书笔记(10)-Lab 11 Process Control

    Lab 11 Process Control Sequence 1: Job Control 1. [student@stationX ~]$ su - 2. Begin some jobs in t ...

  2. C# - SPC(Statistical Process Control)系统 - 6西格玛数据决策和Chart模块的开发与实现

    Statistical Process Control 简介 统计过程控制(Statistical Process Control)是一种借助数理统计方法的过程控制工具.它对生产过程进行分析评价,根据 ...

  3. A MacFUSE-Based Process File System for Mac OS X

    referer: http://osxbook.com/book/bonus/chapter11/procfs/ Processes as Files The process file system  ...

  4. which type of VS files should be committed into a version control system

    which type of VS files should be committed into a version control system? aps, no: last resource edi ...

  5. Version Control System

    Version  Control System(版本控制系统),是一种记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统.版本控制系统不仅可以应用于软件源代码的文本文件,而且可以对任何类型 ...

  6. version control system:git/hg/subversion/cvs/clearcase/vss。software configruation management。代码集成CI:Cruisecontrol/hudson/buildbot

    version control system: git/hg/subversion/cvs/clearcase/vss software configruation management: daily ...

  7. 开源网络准入系统(open source Network Access Control system)

    开源网络准入系统(open source Network Access Control system) http://blog.csdn.net/achejq/article/details/5108 ...

  8. LED Mood Light Factory-Smart Mood Light: Control System Principle

    Intelligent devices have become more and more widespread in our lives. Intelligent scene lights are ...

  9. 【小问题】为啥乱搞就不行,golang没安装在系统目录下,导致go get出现"package bytes: directory "/home/ahfu/go/src/bytes" is not using a known version control system"

    想在自己的账号下安装golang开发环境,于是这样配置: wget https://dl.google.com/go/go1.14.2.linux-amd64.tar.gz cd /home/ahfu ...

随机推荐

  1. iOS 集成Weex入门教程

    前言 自Weex发布伊始, 其口号 "Write Once, Run Everywhere"就吸引了大批前端与客户端程序猿纷纷入坑, 我也不能独善其中. 就我目前所学习Weex的经 ...

  2. Django中使用CKEditor代码高亮显示插件Code Snippet

    Django使用CKEditor可以安装django-ckeditor这个模块,具体步骤可按照这里进行:http://www.nanerbang.com/article/2/ 我在富文本编辑器中想使用 ...

  3. struct和typedef struct在c语言中的用法

    在c语言中,定义一个结构体要用typedef ,例如下面的示例代码,Stack sq:中的Stack就是struct Stack的别名. 如果没有用到typedef,例如定义 struct test1 ...

  4. 【树莓派】制作树莓派最小镜像:img裁剪瘦身

    制作树莓派镜像,可以参考这篇文章:http://blog.csdn.net/talkxin/article/details/50456282 摘录部分要点内容如下(如果作者不允许转载,请联系即删除): ...

  5. shell学习指南-阅读笔记

    shell学习指南真不是刚开始学习shell应该看得书,虽然其中讲了简单的linux命令,shell语法等,但是每章也有些深入和生僻地方,我想如果我刚学shell看到这样的地方一定会头疼的要死.或许也 ...

  6. MVC学习笔记2 - Razor语法

    Razor 同时支持 C# (C sharp) 和 VB (Visual Basic). C# 的主要 Razor 语法规则 Razor 代码封装于 @{ ... } 中 行内表达式(变量和函数)以 ...

  7. Iterator 的hasNext方法和next方法

    这两个方法都有指向的移动,不同的是,一个返回boolean,一个返回对象: hasNext():判断当前元素是否存在,并没有指向的移动 next():返回当前元素, 并指向下一个元素 请看代码吧: L ...

  8. cloud-init 工作原理 - 每天5分钟玩转 OpenStack(171)

    cloud-init 是 linux 的一个工具,当系统启动时,cloud-init 可从 nova metadata 服务或者 config drive 中获取 metadata,完成包括但不限于下 ...

  9. Java面试指导

    Java面试指导   想要成为合格的Java程序员或工程师到底需要具备哪些专业技能,面试者在面试之前到底需要准备哪些东西呢?本文陈列的这些内容既可以作为个人简历中的内容,也可以作为面试的时候跟面试官聊 ...

  10. 老李分享:接电话扩展之uiautomator 1

    老李分享:接电话扩展之uiautomator   poptest是国内唯一一家培养测试开发工程师的培训机构,以学员能胜任自动化测试,性能测试,测试工具开发等工作为目标.如果对课程感兴趣,请大家咨询qq ...