有啥用?#
很多我们项目排期进入联调、测试阶段,如果QA同学是直接跟你要一个后端环境的话,那简单点大概率你就直接使用./xxx &
的方式启动程序。
但是说不定他测着测着触发了啥预期外的东西,程序就挂了。这时你可能还没到公司呢!QA同学就给你打电话来了,一顿客套话,辛苦xxx同学帮忙启动一下后端的程序......
所以了解下supervisor
这个工具还是很有必要的,它可以自动将挂了的程序重新拉起来。然后我们还能指定它的错误日志输出的位置。代码上线前,我们不仅可以关注到QA同学提到的Case,还能去看看程序的error log
、wanring log
中有没有QA同学没有发现的问题,双份保险。
嗯......
supervisor
用起来很简单,4分钟了解下即可。
安装#
~]# yum list | grep supervisor
安装之后,我们就得到的了如下3个二进制的命令:
echo_supervisor_conf
: 将supervisor
相关的所有配置打印出来。
supervisord
:启动命令。
supervisorctl
:管理我们托管进supervisor
中的进程。
生成配置文件#
其实你安装完supervisor
之后,会自动生成一份配置文件:/etc/supervisor.conf
但是我发现在centos6中的安装的supervisor
生成的配置文件不能直接用,少了很多东西。所以才有了本小结中的手动生成一份配置文件。
~]# echo_supervisord_conf > /etc/supervisord.conf
你可以参照下面的配置,去修改你的自己的配置,其实我也没有定制什么东西,就是保留了必要的配置参数而已。
1、配置文件中的
;
是注释符号2、为了让篇幅短一点,配置文件中没啥用的配置、注释、或者像什么提供一个可视化的界面这种鸡肋的东西,我就直接删掉了。有一天你自己的真正去用的时候可以挨个看看,也都不复杂。
[unix_http_server] file=/run/supervisor.sock ; (the path to the socket file) [supervisord] logfile=/var/log/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log) logfile_maxbytes=50MB ; (max main logfile bytes b4 rotation;default 50MB) logfile_backups=10 ; (num of main logfile rotation backups;default 10) loglevel=info ; (log level;default info; others: debug,warn,trace) pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid) nodaemon=false ; (start in foreground if true;default false) minfds=1024 ; (min. avail startup file descriptors;default 1024) minprocs=200 ; (min. avail process descriptors;default 200) [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///run/supervisor.sock ; use a unix:// URL for a unix socket [include] files = supervisord.d/*.ini
第一个注意点:linux中的程序启动之后,会有个对应的socket文件。supervisord启动之后这个socket文件位置通过[unix_http_server]中的file指定。 而且supervisorctl命令需要和supervisord在本地基于socket文件交互,所以[supervisorctl]serverurl要和[unix_http_server]中的file保持同步。
第二个注意点:其实希望大家重点关注的就是上面这个配置文件中`[include]`部分,它会加载supervisord.d/目录下所有的x.ini文件。
在/etc目录下创建:supervisord.d目录存放ini文件。
那*.ini
文件是啥呢?
答案:比如你想将程序A托付给supervisor
管理,那就按要求的格式,为程序A创建一个A.ini配置文件,在这个文件中定义好,程序A的二进制文件在哪里、执行啥命令启动程序A、日志文件在哪里...等等。
启动supervisor#
Centos7
systemctl start supervisord;systemctl enable supervisord
Centos6
# 查看帮助文档 ~]# supervisord --help supervisord -- run a set of applications as daemons. Usage: /root/.jumbo/bin/supervisord [options] Options: -c/--configuration FILENAME -- configuration file path (searches if not given) ... # 启动 ~]# supervisord -c /etc/supervisord.conf
自定义配置文件#
*.ini
文件的格式可以通过echo_supervisor_conf
命令找到,它就长下面这样:
所以参考这个配置文件,我们可以搞一个自己的ini配置,如下:
[program:bairimeng_machi] ;bairimeng_machi是自定义的项目名称,之后supercisorctl命令管理bairimeng_machi ;command 启动程序的相对路径, can take args command=/home/worker/workerspace/machi.sh numprocs=1 ;directory 在执行command之前,需要切换到哪个目录中 directory=/home/worker/workerspace/ ;supervisord启动时,是否同时启动 autostart=true ;autorestart意外退出后,是否重新启动 autorestart=true startsecs=30 startretries=3 exitcodes=0,2 stopsignal=QUIT stopwaitsecs=10 ;user 使用哪个用户启动本程序 user=worker ;redirect_stderr将标准错误,重定向到标准输出 redirect_stderr=true ;stdout_logfile 标准输出的日志文件的位置 stdout_logfile=/home/worker/workerspace/etcd.stdout.log stdout_logfile_maxbytes=64MB stdout_logfile_backups=5 stdout_capture_maxbytes=1MB stdout_events_enabled=false
配置文件中的目录最好提前创建出来,并把所有者、所属组都指向配置文件中:user 部分指定的用户。
不然很可能因为该用户没有创建目录的权限,而导致整个任务失败。
控制命令#
当有新的ini文件被托管进来时,执行如下命令启动被托管的程序
]# supervisorctl update
查看被托管程序的状态:
]# supervisorctl status bairimeng_machi bairimeng_machi STARTING ]# supervisorctl status bairimeng_machi bairimeng_machi RUNNING pid 10630, uptime 0:02:17
关闭被托管的程序
]# supervisorctl stop bairimeng_machi bairimeng_machi: stopped ]# supervisorctl status bairimeng_machi bairimeng_machi STOPPED Aug 29 11:38 PM
启动程序
]# supervisorctl start bairimeng_machi bairimeng_machi: started ]# supervisorctl status bairimeng_machi bairimeng_machi RUNNING pid 17810, uptime 0:01:06
重启
supervisorctl restart bairimeng_machi
重新启动配置中的所有程序
]# supervisorctl reload Restarted supervisord ]# supervisorctl status bairimeng_machi bairimeng_machi STARTING
到这里,你就可以放心大胆的去做别的事了,程序挂掉之后,supervisor会自动帮你拉起的。