写点什么

别再找我给你重启程序啦!让你 supervisor 帮你搞定

用户头像
胧月
关注
发布于: 刚刚

1、有啥用?

很多时候,我们项目排期进入联调、测试阶段,如果 QA 同学是直接跟你要一个后端环境的话,那大概率你就直接使用./xxx &的方式启动程序了。

但是说不定他测着测着触发了啥预期外的东西,程序就挂了。这时你可能还没到公司呢!QA 同学就给你打电话来了,一顿客套话,然后重点来了:辛苦 xxx 同学帮忙启动一下后端的程序...... 内心一万个....


所以了解下 supervisor 这个工具还是很有必要的,它可以自动将挂了的程序重新拉起来。然后我们还能指定它的错误日志输出的位置。代码上线前,我们不仅可以关注到 QA 同学提到的 Case,还能去看看程序的 error log、wanring log 中有没有 QA 同学没有发现的问题,双份保险。


supervisor 用起来很简单,4 分钟了解下即可。

2、安装

 ~]# yum list | grep  supervisor
复制代码

安装之后,我们就得到的了如下 3 个二进制的命令:

echo_supervisor_conf: 将 supervisor 相关的所有配置打印出来。

supervisord:启动命令。

supervisorctl:管理我们托管进 supervisor 中的进程。

3、生成配置文件

其实你安装完 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 希望它干什么......

4、启动 supervisor

Centos7

systemctl start supervisord;systemctl enable supervisord
复制代码

Centos6

# 查看帮助文档~]# supervisord --helpsupervisord -- 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
复制代码

5、自定义配置文件

*.ini 文件的格式可以通过 echo_supervisor_conf 命令找到,它就长下面这样:


所以参考这个配置文件,我们可以搞一个自己的 ini 配置,如下:

[program:bairimeng_machi];bairimeng_machi是自定义的项目名称,之后supercisorctl命令管理bairimeng_machi;command 启动程序的相对路径, can take argscommand=/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/bairimeng_machi.stdout.log stdout_logfile_maxbytes=64MBstdout_logfile_backups=5                             stdout_capture_maxbytes=1MB  stdout_events_enabled=false   
复制代码

配置文件中的目录最好提前创建出来,并把所有者、所属组都指向配置文件中:user 部分指定的用户。

不然很可能因为该用户没有创建目录的权限,而导致整个任务失败。

6、控制命令

当有新的 ini 文件被托管进来时,执行如下命令启动被托管的程序

]# supervisorctl update 
复制代码

查看被托管程序的状态:

]# supervisorctl status  bairimeng_machibairimeng_machi   STARTING
]# supervisorctl status bairimeng_machibairimeng_machi RUNNING pid 10630, uptime 0:02:17
复制代码

关闭被托管的程序

]# supervisorctl stop bairimeng_machibairimeng_machi: stopped
]# supervisorctl status bairimeng_machibairimeng_machi STOPPED Aug 29 11:38 PM
复制代码

启动程序

]# supervisorctl start bairimeng_machibairimeng_machi: started
]# supervisorctl status bairimeng_machibairimeng_machi RUNNING pid 17810, uptime 0:01:06
复制代码

重启

supervisorctl restart bairimeng_machi
复制代码

重新启动配置中的所有程序

]# supervisorctl reloadRestarted supervisord
]# supervisorctl status bairimeng_machibairimeng_machi STARTING
复制代码

到这里,你就可以放心大胆的去做别的事了,程序挂掉之后,supervisor 会自动帮你拉起的哦~


来源:https://mp.weixin.qq.com/s/he88xtewKSeB_i7JG-_9Kg

用户头像

胧月

关注

还未添加个人签名 2021.08.17 加入

还未添加个人简介

评论

发布
暂无评论
别再找我给你重启程序啦!让你supervisor帮你搞定