Supervisor介绍:

Supervisor (http://supervisord.org) 是一个用Python写的进程管理工具,可以很方便的用来启动、重启、关闭进程(不仅仅是Python进程)。除了对单个进程的控制,还可以同时启动、关闭多个进程,比如很不幸的服务器出问题导致所有应用程序都被杀死,此时可以用 supervisor同时启动所有应用程序而不是一个一个地敲命令启动。Supervisor是一款Linux下的进程管理软件,最主要的两个功能是:
1)将非daemon程序变成deamon方式运行,对于daemon程序则不能监控。
2)对程序进行监控,当程序退出时,可以自动拉起程序。

安装supervisor:

supervisor是基于python开发的,安装supervisor前,需要检查系统是否已经安装python环境;
在ubuntu上安装可以使用apt-get方式直接安装:
#apt-get install supervisor
或者可以使用pip安装:
#pip install supervisor

supervisor配置示例:

; supervisor config file
[unix_http_server]
file=/var/run/supervisor.sock   ; (the path to the socket file)
chmod=0700                       ; sockef file mode (default 0700)
[supervisord]
logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)
childlogdir=/var/log/supervisor            ; ('AUTO' child log dir, default $TEMP)
; the below section must remain in the config file for RPC
; (supervisorctl/web interface) to work, additional interfaces may be
; added by defining them in separate rpcinterface: sections
[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface
[supervisorctl]
serverurl=unix:///var/run/supervisor.sock ; use a unix:// URL  for a unix socket
; The [include] section can just contain the "files" setting.  This
; 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 = /etc/supervisor/conf.d/*.conf

Supervisor的基本使用

Supervisor相当强大,提供了很丰富的功能,不过我们可能只需要用到其中一小部分。
安装完成之后,可以编写配置文件,来满足自己的需求。
为了方便,我们把配置分成两部分:supervisord(supervisor是一个C/S模型的程序,这是server端,对应的有client端:supervisorctl)和应用程序(即我们要管理的程序)。
首先来看 supervisor 的配置文件,安装完 supervisor 之后,可以运行 echo_supervisord_conf 命令输出默认的配置项,也可以重定向到一个配置文件里:
#echo_supervisord_conf > /etc/supervisor/supervisord.conf

上面生成的是supervisord的初始配置文件,我们可以在里面配置要管理的进程,但通常并不应该这样做,而是通过配置文件中的[include]的方式把不同的程序(组)写到不同的配置文件里。
如有个进程叫:tomcat,那么我们可以在/etc/supervisor/conf.d下创建一个新的配置文件,tomcat.conf,在里面配置tomcat的进程监控。
要确保你的supervisord.conf配置文件中include包含了你自定义的配置文件包含进来,如下:

[include]
files = /etc/supervisor/conf.d/*.conf

下面我们来具体的配置一个进程监控的配置文件,来以daemon的方式启动tomcat:
#vim /etc/supervisor/conf.d/tomcat.conf

[program:tomcat]
command = /home/tomcat/bin/startup.sh
#启动程序的命令;
autostart = true
#在supervisord启动的时候也自动启动;
autorestart = true
#程序异常退出后自动重启;
startsecs = 5
#启动5秒后没有异常退出,就当作已经正常启动了;
startretries = 3
#启动失败自动重试次数,默认是3;
#user = tomcat
#开启进程使用哪个用户和组启动(这里tomcat启动时指定了nobody用户所以就不用再指定了);
redirect_stderr = true
#把stderr重定向到stdout,默认false;
stdout_logfile=/data/log/tomcat/out-memcache.log
#标准日志输出;
stderr_logfile=/data/log/tomcat/err-memcache.log
#错误日志输出;
stdout_logfile_maxbytes = 20MB
#标准日志文件大小,默认50MB;
stdout_logfile_backups = 20
#标准日志文件备份数;

一份配置文件至少需要一个 [program:x] 部分的配置,来告诉 supervisord 需要管理那个进程。
[program:x]语法中的 x 表示 program name,会在客户端(supervisorctl 或 web 界面)显示,在 supervisorctl 中通过这个值来对程序进行start、restart、stop等操作。
日志文件要存放的文件夹要创建好。
使用supervisor还有一个更大的好处就是,可以快速开启多个进程,配置参数如下:

process_name=%(process_num)s
numprocs=3

表示对同一配置开启3个线程。
启动supervisor
#service supervisor start
或者:
#/etc/init.d/supervisor start
也可以指定配置文件进行启动:
#supervisord -c /etc/supervisor/supervisord.conf
Supervisor启动后在/tmp目录会产生supervisord.log 、supervisord.pid 、supervisor.sock这三个文件,如果有问题可以查看日志。
查看启动状态:
# ps -ef| grep supervisor
root 10232 1 0 15:19 ? 00:00:00 /usr/bin/python /usr/bin/supervisord -c /etc/supervisor/supervisord.conf
查看进程启动状态:
#supervisorctl status
tomcat RUNNING pid 1230, uptime 0:01:12
对进程进行start、stop、restart管理:
#supervisorctl stop|start|restart tomcat

Supervisorctl命令使用:

Supervisor可通过维护命令supervisorctl管理或通过web管理界面管理。维护命令supervisorctl有两种用法。一种是命令式,一种是交互式。
命令式:
1.查询所有进程状态:
#supervisorctl status
2.启、停、重启业务进程,tomcat为进程名,即[program:tomcat]里配置的值:
supervisorctl start tomcat
supervisorctl stop tomcat
supervisorctl restart tomcat
3.管理全部进程:
supervisorctl start all
supervisorctl stop all
supervisorctl restart all
4.重新加载配置文件,停止原有进程并按新的配置启动所有进程(注意:所有进程会停止并重启,线上操作慎重)
supervisorctl reload
5.根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而被重启(注意:这才是线上可以操作的命令,不会重启原有进程)
supervisorctl update

交互式:

# supervisorctl
tomcat                       RUNNING   pid 1256, uptime 0:01:47
supervisor> stop tomcat
tomcat: stopped
supervisor> start tomcat
tomcat: started
supervisor> status
tomcat                       RUNNING   pid 1258, uptime 0:00:04
supervisor> restart tomcat
tomcat: stopped
tomcat: started
supervisor> status
tomcat                       RUNNING   pid 1259, uptime 0:00:02
supervisor>

总结:

1)可以自己编写脚本将Supervisor加入chkconfig中,随系统自动启动。 或者可以使用现成的脚本: Supervisor initscripts。
2)除了supervisorctl 之外,还可以配置supervisrod启动web管理界面,这个web后台使用Basic Auth的方式进行身份认证。
3)除了单个进程的控制,还可以配置group,进行分组管理。经常查看日志文件,包括 supervisord的日志和各个 pragram 的日志文件,程序crash 或抛出异常的信息一半会输出到stderr,可以查看相应的日志文件来查找问题。
4)Supervisor有很丰富的功能,还有其他很多项配置,可以在官方文档获取更多信息:http://supervisord.org/index.html