Linux进程维护-supervisor

Supervisor是用Python开发的一套通用的进程管理程序,能将一个普通的命令行进程变为后台daemon,并监控进程状态,异常退出时能自动重启。它是通过fork/exec的方式把这些被管理的进程当作supervisor的子进程来启动,这样只要在supervisor的配置文件中,把要管理的进程的可执行文件的路径写进去即可。也实现当子进程挂掉的时候,父进程可以准确获取子进程挂掉的信息的,可以选择是否自己启动和报警。


安装:

apt-get方式:

# apt install supervisor

pyhton方式:

#wgethttps://pypi.python.org/packages/7b/17/88adf8cb25f80e2bc0d18e094fcd7ab300632ea00b601cbbbb84c2419eae/supervisor-3.3.2.tar.gztar -zxvf supervisor-3.3.2.tar.gz

#python setup.py install


配置:

Supervisor核心的部分是它的配置,与其它组件大同小异,配置主要分为组件本身的参数和管理内容的参数两大部分。

先看supervisor自己的配置:

默认配置文件的位置:/etc/supervisor.conf/etc/supervisor/supervisor.conf

如果没有自动生成,可以通过命令自己生成一个初始模板:

#echo_supervisord_conf > /etc/supervisor.conf

直接按照我实际的一个配置文件来详细说明下各配置的意义;


[supervisord]
# supervisord的日志文件
logfile = /tmp/supervisor/supervisor.log
#保留日志的大小,超过后会重建,设成0表示无上限
logfile_maxbytes = 50MB
#日志备份个数,0标识无备份
logfile_backups = 10
#日志级别
loglevel = info
#pid文件,需要临时保存pid信息
pidfile = /tmp/supervisor/supervisord.pid
#是否前台模式启动,默认false以守护进程方式启动
nodaemon = False
#用什么用户启动
user = root

[unix_http_server]
#unix socket文件
file = /tmp/supervisor/supervisor.sock
#文件的所有者
chown = root

[supervisorctl]
serverurl = unix:///tmp/supervisor/supervisor.sock

[include]
files = /etc/supervisord.d/*.conf

Supervisor的作用是管理进程,所以我们还要关注被监控内容的配置。

内容配置可以直接添加在上面的/etc/supervisor.conf中,也可以单独放在自己的文件中。我这里采用的是将内容配置以/etc/supervisord.d/*.conf的方式存放,同时在上面/etc/supervisor.confinclude进来。

内容配置必须是[program:your-service-name]这种模板为开始的标识


[program:my-service]
#可以不设置,默认为[program:XXX]中的后半部分
process_name=%(program_name)s-%(process_num)01d
#切换目录,为后面command做准备
directory=/home/work/log-service
#真正要执行的启动命令,进程挂掉后通过这个命令把服务拉起来
command=/usr/bin/pypy service.py -c /home/work/log- service /conf/my-service-config.yml –debug
#supervisor启动时时候直接启动内容服务
autostart=true
#内容进程挂掉后如何处理?默认是unexpected,只有异常结束才会重启;true表示都会重启;false表示不做处理
autorestart=true
#重启时尝试的次数
startretries=3
#重启成功后监控的时常,启动后3秒内进程没有退出就认为是启动成功。默认为1秒
startsecs=3
#被supervisor管理的进程本身如果也存在子进程,那么该进程被kill时是否发送信号给它的子进程。默认为false
killasgroup=true
#同上,不是kill,是stop,默认也是false
stopasgroup=true

supervisorctl命令:

supervisor进行操作的命令是supervisorctl,常用命令如下:

supervisorctl status
supervisorctl stop my-service
supervisorctl start my-service
supervisorctl restart my-service
supervisorctl reload
supervisorctl update

 

supervisor可以自动监控和restart服务进程,但是如果在云平台VM或者容器内,我们同时也要求supervisor服务本身也要随实例开机启动,如何实现?

先参考《Linux开机启动项详解 》了解下开机启动的原理和如何设置,再回头来看supervisor就简单了

/lib/systemd/system/目录下可以找到supervisor.service文件。

设置开机启动项:

#systemctl enable supervisord.service

看似完美了,其实这里还有个小坑。在supervisor.conf里我们通过nodaemon = Falsesupervisor配置成了守护进程,也就意味着虽然添加了启动项但是我们很难知道supervisor是否真正启动成功,如果失败了前面做的一切工作都是徒劳。

2种改造方式:

第一种,将nodaemon改成true

第二种,将supervisord.serviceservicetype改成forking,所有的通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为该服务的主进程继续运行


猜你喜欢

转载自blog.csdn.net/yejingtao703/article/details/80808005