介绍

在一个分布式环境中,每台机器上可能需要启动和停止多个进程,使用命令行方式一个一个手动启动和停止非常麻烦,而且查看每个进程的状态也很不方便。为此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错误,可执行下面的代码解决:

1
2
wget http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
rpm -ivh epel-release-latest-7.noarch.rpm

配置

安装完成后执行如下命令,生成默认配置文件:

1
echo_supervisord_conf > /etc/supervisord.conf

修改配置文件vim /etc/supervisord.conf,将最后两行修改为:

1
2
[include]
files = supervisord.d/*.ini

表示包含/etc/supervisord.d下的所有ini后缀的配置文件,其中每个ini代表一个进程的启动配置。

继续把配置中/tmp路径换成/var/supervisord(由于tmp是临时目录,有可能会被系统自动删除,所以建议换个目录)

1
2
:s/\/tmp/\/var\/supervisord       #单行替换
:1,$s/\/tmp/\/var\/supervisord/g #或者全局替换

修改完配置之后,创建配置中相关的目录和文件:

1
2
3
4
mkdir -p /var/supervisord
touch /var/supervisord/supervisor.sock
touch /var/supervisord/supervisor.log
touch /var/supervisord/supervisor.pid

一个jar进程的配置文件示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
[program:demo]
command=/usr/bin/java -jar /root/demo.jar
directory=/root
priority=90
numprocs=1
autostart=true
autorestart=true
startsecs=10
startretries=10
exitcodes=0
stopsignal=KILL
stopwaitsecs=10
;Log
stderr_logfile=/root/logs/error.log
stdout_logfile=/root/logs/info.log
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_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

启动,停止,查看服务状态:

1
2
3
systemctl start supervisord
systemctl stop supervisord
systemctl status supervisord

管理进程

启动,停止,重启,查看状态:

1
2
3
4
supervisorctl start demo
supervisorctl stop demo
supervisorctl restart demo
supervisorctl status

重新加载进程配置文件:

1
2
supervisorctl reread
supervisorctl update

按组划分进程

supervisor可以通过设置优先级按顺序启动进程,但不支持等待上个进程完再执行下一个进程,在github上存在这个open issue

可通过给进程划分组的方式变相实现,首先修改配置文件vim /etc/supervisord.conf,为进程设置组:

1
2
3
[group:mygroup]
programs=demo1,demo2 ; each refers to 'x' in [program:x] definitions
priority=999 ; the relative start priority (default 999)

之后再延迟手动启动组内进程:

1
supervisorctl restart mygroup:*