使用Supervisor管理Redis进程html
环境:MAC OSpython
Supervisor (http://supervisord.org) 是一个用 Python 写的进程管理工具,能够很方便的用来启动、重启、关闭进程(不单单是 Python 进程)。除了对单个进程的控制,还能够同时启动、关闭多个进程,好比很不幸的服务器出问题致使全部应用程序都被杀死,此时能够用 supervisor 同时启动全部应用程序而不是一个一个地敲命令启动。git
安装过程,redis
安装pip:shell
➜ ~ sudo easy_install pip服务器
而后安装supervisor
svn
➜ ~ sudo pip install supervisor工具
安装完成。spa
Supervisor 至关强大,提供了很丰富的功能,不过咱们可能只须要用到其中一小部分。安装完成以后,能够编写配置文件,来知足本身的需求。为了方便,咱们把配置分红两部分:supervisord(supervisor 是一个 C/S 模型的程序,这是 server 端,对应的有 client 端:supervisorctl)和应用程序(即咱们要管理的程序)。.net
首先来看 supervisord 的配置文件。安装完 supervisor 以后,能够运行echo_supervisord_conf 命令输出默认的配置项,也能够重定向到一个配置文件里:
➜ ~ type echo_supervisord_conf echo_supervisord_conf is /usr/local/bin/echo_supervisord_conf ➜ ~ echo_supervisord_conf > /Users/xinxingegeya/IDE/supervisor/etc/supervisord.conf
生成的该配置文件为默认配置选项,具体详细介绍请参照:http://supervisord.org/configuration.html
可使用-c参数指定配置文件,若是没有指定的话会从如下位置寻找配置文件,
$CWD/supervisord.conf
$CWD/etc/supervisord.conf
/etc/supervisord.conf
../etc/supervisord.conf (Relative to the executable)
../supervisord.conf (Relative to the executable)
注意:CWD是current work directory的缩写。
以下启动supervisord,
➜ supervisor supervisord -c ./etc/supervisord.conf ➜ supervisor ps -ef | grep supervisord 501 1441 1 0 11:45下午 ?? 0:00.01 /usr/bin/python /usr/local/bin/supervisord -c ./etc/supervisord.conf 501 1455 822 0 11:45下午 ttys000 0:00.00 grep --color=auto --exclude-dir=.bzr --exclude-dir=CVS --exclude-dir=.git --exclude-dir=.hg --exclude-dir=.svn supervisord ➜ supervisor
能够看到启动成功。那么如何来管理进程呢?
使用supervisor管理进程,首先要有一个进程的配置文件,以redis的进程为例,使用supervisor管理redis的进程。
redis的安装过程略,具体能够参考http://my.oschina.net/xinxingegeya/blog/389155,下面来配置一个redis进程的配置文件。
[program:redis_7000] directory = /Users/xinxingegeya/IDE/redis/redis_7000 ; 程序的启动目录 command = /usr/local/bin/redis-server /Users/xinxingegeya/IDE/redis/redis_7000/7000.conf ; 启动命令,能够看出与手动在命令行启动的命令是同样的 autostart = true ; 在 supervisord 启动的时候也自动启动 autorestart = true ; 程序异常退出后自动重启 startsecs = 5 ; 启动 5 秒后没有异常退出,就看成已经正常启动了 startretries = 3 ; 启动失败自动重试次数,默认是 3 user = xinxingegeya ; 用哪一个用户启动 redirect_stderr = true ; 把 stderr 重定向到 stdout,默认 false stdout_logfile_maxbytes = 20MB ; stdout 日志文件大小,默认 50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数 ; stdout 日志文件,须要注意当指定目录不存在时没法正常启动,因此须要手动建立目录(supervisord 会自动建立日志文件) stdout_logfile = /Users/xinxingegeya/IDE/redis/log/redis_7000_stdout.log
该program的名字表示这是一个在端口7000上启动的redis进程。注意redis进程要以非daemon方式启动。
须要在supervisord.conf配置文件中包含该进程配置文件。打开supervisord.conf配置文件修改include选项为:
[include] files = ../*.supervisor
表示该配置文件所在目录的父级目录中的以supervisor结尾的配置都要包含进来。
刚才配置的redis_7000进程的配置文件的路径为,
/Users/xinxingegeya/IDE/redis/redis_7000/redis_7000.supervisor
因此要在supervisord.conf的父级目录中建立一个以supervisor结尾的软连接。以下,
➜ supervisor ln ~/IDE/redis/redis_7000/redis_7000.supervisor redis_7000.supervisor ➜ supervisor ll total 88 drwxr-xr-x 3 xinxingegeya staff 102B 4 14 00:09 etc -rw-r--r--@ 2 xinxingegeya staff 41K 3 23 22:21 redis_7000.supervisor ➜ supervisor
刚才更改了supervisor的配置,从新启动一下supervisord。
Supervisorctl是supervisord的一个命令行客户端工具,启动时须要指定与 supervisord 使用同一份配置文件,不然与 supervisord 同样按照顺序查找配置文件。
启动supervisor后,运行supervisorctl命令,以下,
➜ supervisor supervisorctl redis_7000 RUNNING pid 3479, uptime 0:00:09 supervisor>
能够看到一个被supervisor管理的进程,名字是redis_7000,运行状态为RUNNING。有一些命令能够用来管理进程,好比启动(start),停用(stop),重启(restart),从新启动supervisord(reload),启动新配置或有改动的进程(update),查看被管理的进程的状态(status)等。以下,
➜ supervisor supervisorctl redis_7000 RUNNING pid 3479, uptime 0:00:09 supervisor> status redis_7000 RUNNING pid 3479, uptime 0:06:10 supervisor> stop redis_7000 redis_7000: stopped supervisor> status redis_7000 STOPPED Apr 14 10:13 AM supervisor> start redis_7000 redis_7000: started supervisor> restart redis_7000 redis_7000: stopped redis_7000: started supervisor> stop redis_7000 redis_7000: stopped supervisor> reload Really restart the remote supervisord process y/N? y Restarted supervisord supervisor> status redis_7000 RUNNING pid 3506, uptime 0:00:07 supervisor> update supervisor> stop redis_7000 redis_7000: stopped supervisor> update supervisor> status redis_7000 STOPPED Apr 14 10:15 AM supervisor> reload Really restart the remote supervisord process y/N? y Restarted supervisord supervisor> status redis_7000 STARTING supervisor> status redis_7000 RUNNING pid 3511, uptime 0:00:08 supervisor>
=========END=========