一、supervisor简介Supervisor是一套用Python开发的通用流程管理程序。它可以将一个普通的命令行进程变成后台守护进程,监控进程状态,异常退出时自动重启。.它使用fork/exec将这些托管进程作为主管的子进程启动。这样只需要在supervisor配置文件中写上要管理的进程的可执行文件的路径即可。也实现了当子进程挂掉的时候,父进程可以准确的获取到子进程挂掉的信息,并且可以选择是否自己启动和报警。Supervisor还提供了一个功能,可以为supervisord或者每个子进程设置一个非root用户,这个用户可以管理它对应的进程。注:本文以centos7为例,supervisor版本为3.4.0。2、supervisor安装配置yum源后,直接yuminstallsupervisor安装即可。Debian/Ubuntu可以通过apt安装。apt-getinstallsupervisordpipinstallpipinstallsupervisoreasy_installinstalleasy_installsupervisor3、supervisor使用supervisor配置文件:/etc/supervisord.conf注意:supervisor的配置文件默认是不完整的,但大多数默认情况下,提到的基本功能以上已经满足。子进程配置文件路径:/etc/supervisord.d/注:默认子进程配置文件为ini格式,可在supervisor主配置文件中修改。(不同的安装方式有不同的子进程配置文件路径)4.配置文件说明supervisor.conf配置文件说明:[unix_http_server]file=/tmp/supervisor.sock;UNIXsocket文件,supervisorctl会使用;chmod=0700;socket文件模式,默认为0700;chown=nobody:nogroup;socket文件的属主,格式:uid:gid;[inet_http_server];HTTP服务器,提供web管理界面;port=127.0.0.1:9001;IP和如果端口对公网开放,你需要注意安全;username=user;登录管理后台的用户名;password=123;登录管理后台的密码[supervisord]logfile=/tmp/supervisord.log;日志文件,默认为$CWD/supervisord.loglogfile_maxbytes=50MB;日志文件的大小如果超过就会轮换,默认50MB,如果设置为0则表示无限大logfile_backups=10;日志文件的备份数默认为10,设置为0表示不备份;是否在前台启动,默认为false,即作为守护进程启动minfds=1024;可打开文件描述符的最小值,默认为1024minprocs=200;可开启进程数的最小值,默认为200[supervisorctl]serverurl=unix:///tmp/supervisor.sock;通过UNIXsocket连接supervisord,路径同unix_http_server部分的文件是一致的;serverurl=http://127.0.0.1:9001;通过HTTP连接到supervisord;[program:xx]为托管进程配置参数,xx为进程名称[program:xx]command=/opt/apache-tomcat-8.0.35/bin/catalina.shrun;程序启动命令autostart=true;Startsecs=10也是在supervisord启动的时候自动启动的;如果启动10秒后没有异常退出,说明进程正常启动了,默认1秒autorestart=true;程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程被意外杀死后重启startretries=3;启动失败后自动重试次数,默认3user=tomcat;使用哪个用户启动进程,默认为rootpriority=999;进程启动优先级,默认999,值小优先启动redirect_stderr=true;将stderr重定向到stdout,默认为falsestdout_logfile_maxbytes=20MB;stdout日志文件大小,默认50MBstdout_logfile_backups=20;stdout日志文件备份个数,默认为10;stdout日志文件,需要注意的是,如果指定的目录不存在,则无法正常启动,所以需要手动创建目录(supervisord会自动创建日志文件)stdout_logfile=/opt/apache-tomcat-8.0.35/logs/catalina.outstopasgroup=假;默认为false,当进程被杀死时,是否向进程组发送停止信号,包括子进程killasgroup=false;默认为false,向进程组发送kill信号,包括子进程;包含其他配置文件[include]files=relative/directory/*.ini;您可以指定一个或多个以.ini结尾的配置文件进程配置文件说明:为需要管理的子进程(程序)写一个配置文件,放在/etc/supervisor.d/目录下,扩展名为.ini(每个进程的配置文件可以是单独拆分或者可以把相关的脚本放在一起)比如任意定义一个与脚本的项目名相关的选项组(/etc/supervisord.d/test.conf):#projectname[program:blog]#scriptdirectorydirectory=/opt/bin#脚本执行命令command=/usr/bin/python/opt/bin/test.py#supervisor启动时是否同时启动,默认Trueautostart=true#程序退出时,程序不会自动重启,默认是unexpected,设置子进程挂掉后自动重启。一共有三个选项,false、unexpected和true。如果为假,则在任何情况下都不会重新启动。如果是意外的,只有当进程的退出代码没有在下面的exitcodes中定义时。autorestart=false#这个选项是多少秒后子进程启动,这个如果状态是running,我们就认为启动成功。默认值为1startsecs=1#运行脚本的用户身份user=test#日志输出stderr_logfile=/tmp/blog_stderr.logstdout_logfile=/tmp/blog_stdout.log#将stderr重定向到stdout,默认falseredirect_stderr=true#stdoutlog文件大小,默认50MBstdout_logfile_maxbytes=20M#stdout日志文件备份个数stdout_logfile_backups=20子进程配置示例:#说明同上[program:test]directory=/opt/bincommand=/opt/bin/testautostart=trueautorestart=falsestderr_logfile=/tmp/test_stderr.logstdout_logfile=/tmp/test_stdout.log#user=test5.supervisor命令说明常用命令supervisorctlstatus//查看所有进程的状态supervisorctlstopes//停止esssupervisorctlstartes//启动esssupervisorctlrestart//重启essupervisorctlupdate//修改配置文件后,使用该命令加载新的配置supervisorctlreload//重启配置中的所有程序注意:将es替换为all,管理配置中的所有进程。直接输入supervisorctl,进入supervisorctl的shell界面。这时候可以不用supervisorctl直接使用上面的命令。注意事项使用supervisor进程管理命令前先启动supervisord,否则程序会报错。从命令supervisord-c/etc/supervisord.conf开始。ifcentos7:systemctlstartsupervisord.service//启动supervisor并加载默认配置文件systemctlenablesupervisord.service//将supervisord加入启动项#####常见问题unix:///var/run/supervisor.socknosuchfile问题描述:安装supervisor后没有启动服务,直接使用supervisorctl报错。解决方法:supervisord-c/etc/supervisord.conf命令中指定的进程已经启动,但是supervisor一直在重启。问题描述:命令中的启动方式是backgroundStartup,导致识别不到pid,然后不断重启。这里使用Elasticsearch,命令指定$path/bin/elasticsearch-d解决方法:supervisor检测不到后台启动进程的pid,supervisor本身就是后台启动守护进程,不用担心启动多个supervisord服务,导致无法正常关闭服务有些进程被多个supervisord管理,无法正常关闭进程。解决方法:使用ps-fe|grepsupervisord查看所有启动的supervisord服务并杀死相关进程。更多信息请访问Supervisor官网:http://supervisord.org
