Supervisor的作用和用法是什么,Python项目中如何应用
Admin 2022-09-06 群英技术资讯 293 次浏览
首先,介绍一下supervisor。Supervisor(http://supervisord.org)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制
环境:centos7.4
pip install supervisor
因为是python开发的一个库,可以直接用pip来安装,很方便。
supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。
$ vim ~/.bash_profile #在后面补充: PATH=$PATH:$HOME/bin:/usr/local/python/bin $ source ~/.bash_profile
创建内容介绍,初始化配置文件
mkdir /etc/supervisor echo_supervisord_conf > /etc/supervisor/supervisord.conf
主配置文件参数
[unix_http_server] file=/tmp/supervisor.sock ; UNIX socket 文件,supervisorctl 会使用 ;chmod=0700 ; socket 文件的 mode,默认是 0700 ;chown=nobody:nogroup ; socket 文件的 owner,格式: uid:gid ;[inet_http_server] ; HTTP 服务器,提供 web 管理界面 ;port=127.0.0.1:9001 ; Web 管理后台运行的 IP 和端口,如果开放到公网,需要注意安全性 ;username=user ; 登录管理后台的用户名 ;password=123 ; 登录管理后台的密码 [supervisord] logfile=/tmp/supervisord.log ; 日志文件,默认是 $CWD/supervisord.log logfile_maxbytes=50MB ; 日志文件大小,超出会 rotate,默认 50MB logfile_backups=10 ; 日志文件保留备份数量默认 10 loglevel=info ; 日志级别,默认 info,其它: debug,warn,trace pidfile=/tmp/supervisord.pid ; pid 文件 nodaemon=false ; 是否在前台启动,默认是 false,即以 daemon 的方式启动 minfds=1024 ; 可以打开的文件描述符的最小值,默认 1024 minprocs=200 ; 可以打开的进程数的最小值,默认 200 ; the below section must remain in the config file for RPC ; (supervisorctl/web interface) to work, additional interfaces may be ; added by defining them in separate rpcinterface: sections [rpcinterface:supervisor] supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface [supervisorctl] serverurl=unix:///tmp/supervisor.sock ; 通过 UNIX socket 连接 supervisord,路径与 unix_http_server 部分的 file 一致 ;serverurl=http://127.0.0.1:9001 ; 通过 HTTP 的方式连接 supervisord ; 包含其他的配置文件 [include] files = relative/directory/*.ini ; 可以是 *.conf 或 *.ini
把所有被管理的进程配置文件都放在同一个内容介绍,主配置文件包含进去。
mkdir /etc/supervisor/config.d
vim /etc/supervisor/supervisord.conf [include] files = /etc/supervisor/config.d/*.conf
新建一个配置文件
[program:sougou] #souogu 为程序的名称 command=scrapy crawl sougou #需要执行的命令 directory=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders #命令执行的内容介绍 environment=ASPNETCORE__ENVIRONMENT=Production #环境变量 user=root #用户 stopsignal=INT autostart=true #是否自启动 autorestart=true #是否自动重启 startsecs=3 #自动重启时间间隔(s) stderr_logfile=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders/ossoffical.err.log #错误日志文件 stdout_logfile=/home/mzj/桌面/sougou/sougou/wechat_name/wechat_name/spiders/ossoffical.out.log #输出日志文件
[program:nginx] command = /usr/local/nginx/sbin/nginx -g 'daemon off;' startsecs = 3 autostart = true autorestart = true user = root stdout_logfile = /etc/supervisor/logs/supervisord-nginx.log stderr_logfile = /etc/supervisor/logs/supervisord-nginx-error.log
刚开始有个坑,command = /usr/local/nginx/sbin/nginx 我是这样写的 结果就一直启动nginx 因为这样的话 是后台运行的nginx,然而supervisor 不能管理后台运行进程,所以把nginx daemon off 守护关掉,就让他阻塞在前台bash运行,方便supervisor来管理。
supervisord -c /etc/supervisor/supervisord.conf
unlink /tmp/supervisor.sock
vi /etc/supervisor/supervisord.conf [inet_http_server] port=0.0.0.0:9001 username=user password=123
此处需要注意将 [inet_http_server] 前边的注释也要去掉
superlance就是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的
superlance的组件
superlance是一系列命令行工具的集合,其包括以下这些命令:
1、当supervisord启动的时候,如果我们的listener配置为autostart=true的话,listener就会作为supervisor的子进程被启动。
2、listener被启动之后,会向自己的stdout写一个"READY"的消息,此时父进程也就是supervisord读取到这条消息后,会认为listener处于就绪状态。
3、listener处于就绪状态后,当supervisord产生的event在listener的配置的可接受的events中时,supervisord就会把该event发送给该listener。
4、listener接收到event后,我们就可以根据event的head,body里面的数据,做一系列的处理了。我们根据event的内容,判断,提取,报警等等操作。
5、该干的活都干完之后,listener需要向自己的stdout写一个消息"RESULTnOK",supervisord接受到这条消息后。就知道listener处理event完毕了。
也是python程序,直接pip 安装
pip install superlance
在实际配置supervisor使用superlance之前,首先要安装sendmail,superlance使用这个命令行工具来发送email,利用各种包管理工具都可以简单的安装:
wget /uploads/tupian/20220823/thwfbdkn3sq.gz tar zxvf sendEmail-v1.56.tar.gz cp sendEmail-v1.56/sendEmail /usr/bin/sendemail
发邮件测试一下
sendemail -f 发件人邮箱 -t 收件人邮箱 -s 发件人邮箱smtp服务器 -u "sendEmail" -m "haha" -xu 发件人邮箱 -xp 发件人邮箱密码 -f 发件人 -t 收件人 -s 发件人smtp服务器 -u 主题 -m 内容 -xu 发件人用户名 -xp 发件人密码
现在要做的就是配置一个supervisor配置文件,来一直监听进程的状态变化
[eventlistener:crashmail] command=crashmail -a -s "sendemail -f dataalarm@wjoyxt.com -t alarm@wjoyxt.com -s smtp.mxhichina.com -u 'Process is crashed' -xu dataalarm@wjoyxt.com -xp Bigdata@2019@ -m >/dev/null 2>&1" -m alarm@wjoyxt.com events=PROCESS_STATE_EXITED redirect_stderr=false
或
[eventlistener:crashmail] command=crashmail -a -s "mail -s 'Process is crashed' alarm@wjoyxt.com" -m alarm@wjoyxt.com events=PROCESS_STATE_EXITED redirect_stderr=false
command参数中 -p 参数配置了crashmail只会对名为redis的监控项作出响应,而 -m 参数中则配置了崩溃邮件会被发送到的地址,-a 监控所有项
crashmail是一个主管“事件监听器”,用于订阅PROCESS_STATE_EXITED事件。当crashmail 收到该事件并且转换是"意外的(not expected)"时,crashmail 会将电子邮件通知发送到已配置的地址
events=PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR 多个事件时,用逗号隔开
PROCESS_STATE_EXITED是在一个supervisor的监控项对应的进程意外退出时会触发的事件,这就使得一个进程出现意外退出的情况下会通知到crashmail。
crashmail.py [-p processname] [-a] [-o string] [-m mail_address] [-s sendmail]网址 选项: -p - 指定supervisor process_name。这个过程发送邮件 意外地转换到EXITED状态。如果这个过程是 组的一部分,可以使用 'process_name:group_name'语法。 -a - 当supervisord的任何孩子过渡时发送邮件 出人意料地意外地离开了EXITED状态。覆盖任何-p 在同一个crashmail进程调用中传递的参数。 -o - 指定用作邮件主题标题中前缀的参数。 -s - 用于发送电子邮件的sendmail命令 (例如“ / usr / sbin / sendmail - t - i ”)。必须是接受的命令 stdin上的头和消息数据并发送邮件。默认是 “ / usr / sbin / sendmail - t - i ”。 -m - 指定电子邮件地址。该脚本将向此发送邮件 crashmail检测到进程崩溃时的地址。如果没有电子邮件 如果指定了地址,则不会发送电子邮件。 可以多次指定-p选项,允许 多个过程的规范。指定-a会覆盖任何 选择-p。 示例调用: crashmail.py -p program1 -p group1:program2 -m dev@example.com
添加好一个进程配置文件后
supervisorctl reload
重启一下
整体示例代码
[program:eacloud] command=/root/python/bin/uwsgi --ini uwsgi.ini ; 程序启动命令 directory=/root/tyy autostart=true ; 在supervisord启动的时候也自动启动 startsecs=10 ; 启动10秒后没有异常退出,就表示进程正常启动了,默认为1秒 autorestart=true ; 程序退出后自动重启,可选值:[unexpected,true,false],默认为unexpected,表示进程意外杀死后才重启 startretries=3 ; 启动失败自动重试次数,默认是3 user=root ; 用哪个用户启动进程,默认是root priority=999 ; 进程启动优先级,默认999,值小的优先启动 redirect_stderr=true ; 把stderr重定向到stdout,默认false stdout_logfile_maxbytes=20MB ; stdout 日志文件大小,默认50MB stdout_logfile_backups = 20 ; stdout 日志文件备份数,默认是10 ; stdout 日志文件,需要注意当指定内容介绍不存在时无法正常启动,所以需要手动创建内容介绍(supervisord 会自动创建日志文件) stdout_logfile=/root/tyy/eacloud.log stopasgroup=false ;默认为false,进程被杀死时,是否向这个进程组发送stop信号,包括子进程 killasgroup=false ;默认为false,向进程组发送kill信号,包括子进程 [eventlistener:crashmail-exited] command=/root/python/bin/crashmail -p eacloud -m 1524701427@qq.com events=PROCESS_STATE redirect_stderr=false
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
Python数据可视化之Pyecharts使用,下文有实例供大家参考,对大家了解操作过程或相关知识有一定的帮助,而且实用性强,希望这篇文章能帮助大家,下面我们一起来了解看看吧。
这篇文章主要介绍了python中常见进制之间的转换方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
python中数组array和列表list的基本用法及区别解析,一些朋友可能会遇到这方面的问题,对此在下文小编向大家来讲解一下,内容详细,易于理解,希望大家阅读完这篇能有收获哦,有需要的朋友就往下看吧!
我们知道Django是由Python写成的,一个开放源代码的Web应用框架。本文主要给大家介绍django使用MQTT的方法,那么什么是MQTT?MQTT也叫做消息队列遥测传输协议,其最大优点在于,可以以极少的代码和有限的带宽,为连接远程设备提供实时可靠的消息服务。简单了解完MQTT,下面我们一起来看看在django中怎么使用MQTT。
装饰器接收一个功能,添加一些功能并返回。 在本文中,您将学习如何创建装饰器,以及为什么要使用装饰器。Python有一个有趣的功能,称为装饰器,以便为现有代码添加功能。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008