介绍
在一个分布式环境中,每台机器上可能需要启动和停止多个进程,使用命令行方式一个一个手动启动和停止非常麻烦,而且查看每个进程的状态也很不方便。为此Supervisor工具应运而生,它能够对很方便的对多个进程进行简单高效中心化管理。
安装
1 | yum install supervisor |
---|
直接yum安装会报一个No package supervisor available.
的错误,因为CentOS是RedHat企业版编译过来的,去掉了所有关于版权问题的东西。需先安装epel-release
:
1 | yum install epel-release |
---|
如果执行yum install epel-release
出现No package epel-release available
错误,可执行下面的代码解决:
12 | wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpmrpm -ivh epel-release-latest-7.noarch.rpm |
---|
配置
安装完成后执行如下命令,生成默认配置文件:
1 | echo_supervisord_conf > /etc/supervisord.conf |
---|
修改配置文件vim /etc/supervisord.conf
,将最后两行修改为:
12 | [include]files = supervisord.d/*.ini |
---|
表示包含/etc/supervisord.d
下的所有ini
后缀的配置文件,其中每个ini
代表一个进程的启动配置。
一个jar进程的配置文件示例:
123456789101112131415161718 | [program:demo]command=/usr/bin/java -jar /root/demo.jardirectory=/rootpriority=90numprocs=1autostart=trueautorestart=truestartsecs=10startretries=10exitcodes=0stopsignal=KILLstopwaitsecs=10;Logstderr_logfile=/root/logs/error.logstdout_logfile=/root/logs/info.logredirect_stderr=truestdout_logfile_maxbytes=20MBstdout_logfile_backups=20 |
---|
主要参数介绍:
- directory:执行目录,若有
/home/test/test1.py
;将directory设置成/home/test
,则command只需设置成python test1.py
; - numprocs:进程数量;
- priority:优先级,值越小优先级越高,默认值999;值越小,最先启动,并且最后被关闭;
- autostart:如果是true,当supervisor启动时程序将会自动启动;
- autorestart:程序异常退出后自动重启;
- startsecs:启动后程序需要保持运行的总秒数,则认为启动成功(将进程状态从
STARTING
标记为RUNNING
),默认1秒; - startretries:启动失败自动重试次数,默认3次;
- redirect_stderr:把 stderr 重定向到 stdout,默认 false;
更多配置文件说明,可参见官方文档:http://supervisord.org/configuration.html#program-x-section-values
启动,停止,查看服务状态:
123 | systemctl start supervisordsystemctl stop supervisordsystemctl status supervisord |
---|
管理进程
启动,停止,重启,查看状态:
1234 | supervisorctl start demosupervisorctl stop demosupervisorctl restart demosupervisorctl status |
---|
重新加载进程配置文件:
12 | supervisorctl rereadsupervisorctl update |
---|
按组划分进程
supervisor可以通过设置优先级按顺序启动进程,但不支持等待上个进程完再执行下一个进程,在github上存在这个open issue。
可通过给进程划分组的方式变相实现,首先修改配置文件vim /etc/supervisord.conf
,为进程设置组:
123 | [group:mygroup]programs=demo1,demo2 ; each refers to 'x' in [program:x] definitionspriority=999 ; the relative start priority (default 999) |
---|
之后再延迟手动启动组内进程:
1 | supervisorctl restart mygroup:* |
---|