简介
supervisor是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具。可以很方便的监听、启动、停止、重启一个或多个进程。用supervisor管理的进程,当一个进程意外被杀死,supervisor监听到进程死后,会自动将它重启,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制。
安装
配置好yum源后,可以直接安装
yum install supervisor
启动
supervisord -c /etc/supervisord.conf
常用命令介绍
supervisorctl 是 supervisord的命令行客户端工具
supervisorctl status:查看所有进程的状态
supervisorctl stop es:停止es进程
supervisorctl start es:启动es进程
supervisorctl restart es: 重启es进程
supervisorctl update :配置文件修改后可以使用该命令加载新的配置
supervisorctl reload: 重新启动配置中的所有程序
如何把进程加入管理?
我使用一个名叫zhb_test的进程来做一个简单的案例。
首先,修改配置文件,主要是修改program配置的位置,按照套路来说一般都放到/etc目录。也可以用ini文件作为配置文件。
supervisord.conf这个文件是supervisord本身的配置文件,它可以包含子配置文件,在[include]项下面
[include]
files = /etc/supervisord.d/*.ini
现在添加一个进程管理配置文件zhb_test.ini:
; The below sample program section shows all possible program subsection values,
; create one or more 'real' program: sections to be able to control them under
; supervisor.
[program:zhb_test]
command=/data/program/zhb_test -flags=zhb_test.gflags ; the program (relative uses PATH, can take args)
process_name=%(program_name)s ; process_name expr (default %(program_name)s)
numprocs=1 ; number of processes copies to start (def 1)
directory=/tmp ; directory to cwd to before exec (def no cwd)
umask=022 ; umask for process (default None)
priority=999 ; the relative start priority (default 999)
autostart=true ; start at supervisord start (default: true)
autorestart=true ; retstart at unexpected quit (default: true)
startsecs=4 ; number of secs prog must stay running (def. 1)
startretries=10 ; max # of serial start failures (default 3)
exitcodes=0,2 ; 'expected' exit codes for process (default 0,2)
stopsignal=INT ; signal used to kill process (default TERM)
stopwaitsecs=10 ; max num secs to wait b4 SIGKILL (default 10)
user=root ; setuid to this UNIX account to run the program
stdout_logfile=NONE ; stdout log path, NONE for none; default AUTO
stderr_logfile=NONE ; stderr log path, NONE for none; default AUTO
;redirect_stderr=true ; redirect proc stderr to stdout (default false)
;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=10 ; # of stdout logfile backups (default 10)
;stdout_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;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=10 ; # of stderr logfile backups (default 10)
;stderr_capture_maxbytes=1MB ; number of bytes in 'capturemode' (default 0)
;stderr_events_enabled=false ; emit events on stderr writes (default false)
;environment=A=1,B=2 ; process environment additions (def no adds)
;serverurl=AUTO ; override serverurl computation (childutils)
更新配置文件:supervisorctl update,这样就可以把zhb_test这个进程加入到supervisor管理。
想要重新启动所有被管理的进程,用supervisorctl reload。
如果直接用kill命令kill掉zhb_test进程,那么supervisor会自动重新拉起zhb_test进程,很方便地管理。
如果机器重启,supervisor会开机自启(/etc/init.d/supervisord),那么被它管理的进程也会被拉起。
如果supervisor的ini文件被删除,那么supervisor控制的进程也会被移除,在移除前会stop该进程。
注意:
用supervisor管理redis时,要把redis.conf的daemonize设置为no,否则会重复拉起进程,supervisorctl start时exit status != 0,一直报错。设置为如下:
daemonize no
daemonize设置为yes时,直接用命令启动redis时(bin conf)就无法以后台启动redis,设置为no才能以后台启动redis。