守护进程Supervisor

2023-03-06 15:14:13 浏览数 (2)

介绍

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

0 人点赞