欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux进程维护-supervisor

程序员文章站 2022-04-26 17:06:40
...

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,所有的通信渠道都已建好、启动亦已成功之后,父进程将会退出,而子进程将作为该服务的主进程继续运行

Linux进程维护-supervisor