supervisor介绍

首先,介绍一下supervisor。Supervisor(http://supervisord.org)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制
环境:centos7.4

安装supervisor

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

配置supervisor

创建目录,初始化配置文件
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来管理。

supervisor配置文件详解

  • command:启动程序使用的命令,可以是绝对路径或者相对路径
  • process_name:一个python字符串表达式,用来表示supervisor进程启动的这个的名称,默认值是%(program_name)s
  • numprocs:Supervisor启动这个程序的多个实例,如果numprocs>1,则process_name的表达式必须包含%(process_num)s,默认是1
  • numprocs_start:一个int偏移值,当启动实例的时候用来计算numprocs的值
  • priority:权重,可以控制程序启动和关闭时的顺序,权重越低:越早启动,越晚关闭。默认值是999
  • autostart:如果设置为true,当supervisord启动的时候,进程会自动重启。
  • autorestart:值可以是false、true、unexpected。false:进程不会自动重启,unexpected:当程序退出时的退出码不是exitcodes中定义的时,进程会重启,true:进程会无条件重启当退出的时候。
  • startsecs:程序启动后等待多长时间后才认为程序启动成功
  • startretries:supervisord尝试启动一个程序时尝试的次数。默认是3
  • exitcodes:一个预期的退出返回码,默认是0,2。
  • stopsignal:当收到stop请求的时候,发送信号给程序,默认是TERM信号,也可以是 HUP, INT, QUIT, KILL, USR1, or USR2。
  • stopwaitsecs:在操作系统给supervisord发送SIGCHILD信号时等待的时间
  • stopasgroup:如果设置为true,则会使supervisor发送停止信号到整个进程组
  • killasgroup:如果设置为true,则在给程序发送SIGKILL信号的时候,会发送到整个进程组,它的子进程也会受到影响。
  • user:如果supervisord以root运行,则会使用这个设置用户启动子程序
  • redirect_stderr:如果设置为true,进程则会把标准错误输出到supervisord后台的标准输出文件描述符。
  • stdout_logfile:把进程的标准输出写入文件中,如果stdout_logfile没有设置或者设置为AUTO,则supervisor会自动选择一个文件位置。
  • stdout_logfile_maxbytes:标准输出log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
  • stdout_logfile_backups:标准输出日志轮转备份的数量,默认是10,如果设置为0,则不备份
  • stdout_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
  • stdout_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
  • stderr_logfile:把进程的错误日志输出一个文件中,除非redirect_stderr参数被设置为true
  • stderr_logfile_maxbytes:错误log文件达到多少后自动进行轮转,单位是KB、MB、GB。如果设置为0则表示不限制日志文件大小
  • stderr_logfile_backups:错误日志轮转备份的数量,默认是10,如果设置为0,则不备份
  • stderr_capture_maxbytes:当进程处于stderr capture mode模式的时候,写入FIFO队列的最大bytes值,单位可以是KB、MB、GB
  • stderr_events_enabled:如果设置为true,当进程在写它的stderr到文件描述符的时候,PROCESS_LOG_STDERR事件会被触发
  • environment:一个k/v对的list列表
  • directory:supervisord在生成子进程的时候会切换到该目录
  • umask:设置进程的umask
  • serverurl:是否允许子进程和内部的HTTP服务通讯,如果设置为AUTO,supervisor会自动的构造一个url

启动supervisor

supervisord -c /etc/supervisor/supervisord.conf

有时候kill进程之后需要释放连接

unlink /tmp/supervisor.sock

web界面管理

开启web访问
vi /etc/supervisor/supervisord.conf
[inet_http_server]
port=0.0.0.0:9001
username=user
password=123

此处需要注意将 [inet_http_server] 前边的注释也要去掉

supervisorctl的用法

  • supervisord : 启动supervisor
  • supervisorctl reload :修改完配置文件后重新启动supervisor
  • supervisorctl status :查看supervisor监管的进程状态
  • supervisorctl start 进程名 :启动XXX进程
  • supervisorctl stop 进程名 :停止XXX进程
  • supervisorctl stop all:停止全部进程,注:start、restart、stop都不会载入最新的配置文件。
  • supervisorctl update:根据最新的配置文件,启动新配置或有改动的进程,配置没有改动的进程不会受影响而重启

superlance介绍

superlance就是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的
superlance的组件
superlance是一系列命令行工具的集合,其包括以下这些命令:

  • httpok 通过定时对一个HTTP接口进行GET请求,根据请求是否成功来判定一个进程是否处于正常状态,如果不正常则对进程进行重启。

  • crashmail 当一个进程意外退出时,发送邮件告警。

  • memmon 当一个进程的内存占用超过了设定阈值时,发送邮件告警。

  • crashmailbatch 类似于crashmail的告警,但是一段时间内的邮件将会被合成起来发送,以避免邮件轰炸。

  • fatalmailbatch 当一个进程没有成功启动多次后会进入FATAL状态,此时发送邮件告警。与crashmailbatch一样会进行合成报警。

  • crashsms 当一个进程意外退出时发送短信告警,这个短信也是通过email网关来发送的。
    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完毕了。

Supervisord支持的Event

  • PROCESS_STATE 进程状态发生改变
  • PROCESS_STATE_STARTING
    进程状态从其他状态转换为正在启动(Supervisord的配置项中有startsecs配置项,
    是指程序启动时需要程序至少稳定运行x秒才认为程序运行正常,在这x秒中程序状态为正在启动)
  • PROCESS_STATE_RUNNING 进程状态由正在启动转换为正在运行
  • PROCESS_STATE_BACKOFF 进程状态由正在启动转换为失败
  • PROCESS_STATE_STOPPING 进程状态由正在运行转换为正在停止
  • PROCESS_STATE_EXITED 进程状态由正在运行转换为退出
  • PROCESS_STATE_STOPPED进程状态由正在停止转换为已经停止(exited和stopped的区别是exited是程序自行退出,而stopped为人为控制其退出)
  • PROCESS_STATE_FATAL 进程状态由正在运行转换为失败
  • PROCESS_STATE_UNKNOWN 未知的进程状态
  • REMOTE_COMMUNICATION 使用Supervisord的RPC接口与Supervisord进行通信
  • PROCESS_LOG 进程产生日志输出,包括标准输出和标准错误输出
  • PROCESS_LOG_STDOUT 进程产生标准输出
  • PROCESS_LOG_STDERR 进程产生标准错误输出
  • PROCESS_COMMUNICATION 进程的日志输出包含 和
  • PROCESS_COMMUNICATION_STDOUT 进程的标准输出包含 和
  • PROCESS_COMMUNICATION_STDERR进程的标准错误输出包含 和
  • SUPERVISOR_STATE_CHANGE_RUNNING Supervisord 启动
  • SUPERVISOR_STATE_CHANGE_STOPPING Supervisord 停止
  • TICK_5 每隔5秒触发
  • TICK_60 每隔60秒触发
  • TICK_3600 每隔3600触发
  • PROCESS_GROUP Supervisord的进程组发生变化
  • PROCESS_GROUP_ADDED 新增了Supervisord的进程组
  • PROCESS_GROUP_REMOVED 删除了Supervisord的进程组

安装superlance

也是python程序,直接pip 安装

pip install superlance

superlance实战

在实际配置supervisor使用superlance之前,首先要安装sendmail,superlance使用这个命令行工具来发送email,利用各种包管理工具都可以简单的安装:

wget http://caspian.dotconf.net/menu/Software/SendEmail/sendEmail-v1.56.tar.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

Supervisor在python3的使用相关推荐

  1. 使用supervisor支持Python3程序 (解决找不到Module的问题)

    使用supervisor支持Python3程序 (解决找不到Module的问题) 参考文章: (1)使用supervisor支持Python3程序 (解决找不到Module的问题) (2)https: ...

  2. nginx+uWSGI+django+virtualenv+supervisor发布web服务器

    导论 WSGI是Web服务器网关接口.它是一个规范,描述了Web服务器如何与Web应用程序通信,以及Web应用程序如何链接在一起以处理一个请求,(接收请求,处理请求,响应请求) 基于wsgi运行的框架 ...

  3. python Supervisor

    安装 supervisor对python3支持不好,须使用python2 sudo pip install supervisor 配置 运行echo_supervisord_conf命令输出默认的配置 ...

  4. 第一篇supervisor集群管理工具cesi安装详解-如何安装supervisor

    第一篇supervisor集群管理工具cesi安装详解-如何安装supervisor 环境 准备 安装python3.7.4 问题 解决方法 安装supervisor 配置supervisor服务 启 ...

  5. supervisor+nginx+cesi

    欢迎使用Markdown编辑器写博客 先留个坑,项目完了再完善 supervisor with python3 support https://github.com/Supervisor/superv ...

  6. 【flask】适合生产环境的高并发部署方案(gunicorn + gevent + supervisor)

    文章目录 1.安装docker镜像 2.查看alphin版本 3.更换alpine源 4.更换pip源 5.安装requirements.txt 6.安装完成 7.启动flask应用 8.用gunic ...

  7. supervisor看守进程

    supervisor可以用于看守正在运行的服务,如果服务以外停止,他会在设置的时间间隔内重新启动该服务. 本测试使用的系统是TencentOS3.1. 安装supervisor最简单方法是使用yum. ...

  8. vue+django前后端项目部署

    一.python3的安装 1.安装python前的库环境: yum install gcc patch libffi-devel python-devel zlib-devel bzip2-devel ...

  9. 关于nginx unit服务非正常关闭后,无法重新启动问题的处理

    昨天在前领导技术大牛吕哥的帮忙下,python服务管理从nginx+supervisor+uwsgi+python3改为了轻便结构nginx + unit + python3,部署和配置起来顿时轻松起 ...

最新文章

  1. 团体程序设计天梯赛-练习集L1-016. 查验身份证
  2. 第十周项目实践1 二叉树算法验证
  3. 大话移动通信pdf_移动通信是怎么实现的?
  4. ArrayList方法源码
  5. 如何在SAP Cloud for Customer里开发具有依赖关系的互动下拉列表
  6. 【CodeForces - 798D】Mike and distribution (思维构造,贪心,黑科技)
  7. LINUX SHELL中echo如何处理特殊字符
  8. 年度调薪一般涨多少_如何回答别人询问工资?高情商的人一般选择这样巧妙答复...
  9. M2Det 论文阅读心得[目标检测领域]
  10. 计算机歌曲带歌词,mp3上怎么看歌词?我的机子说是可以显示的啊
  11. 小说自动采集+【深度seo优化】+自适应=小说网站源码
  12. JDK下载安装教程及环境变量配置
  13. 基于javaweb+jsp的房屋租赁管理系统(java+SSM+Layui+Maven+Mysql+Jsp)
  14. 解决Mac电脑报错:You don‘t have permission to access that port.
  15. 三十难立,四十有惑:三个代际的产品经理一起聊聊职业体验
  16. 关于MMORPG多人对战中热点问题的解决思路讨论
  17. ch9200 usb网卡驱动_21包邮的PCMCIA无线网卡开箱+对比测评
  18. Esp8266 进阶之路19 【外设篇①】esp8266驱动 ds18b20、dht11 温湿度传感器,采集温湿度传感器到服务器。(附带Demo)
  19. IOS 移动端视频播放不全屏
  20. 中国手机显示屏产业运作状况与发展格局分析报告2022版

热门文章

  1. Java中如何将12345变为24680_大学计算机及程序设计Ⅲ(魏同明)-中国大学mooc-题库零氪...
  2. 大数据治理平台解决方案(90页PPT 附下载)
  3. 录取清华/北大/中科院/北邮都有!双非北京信息科技大学计算机考研光荣榜
  4. 【小程序】蓝牙锁——AES128加解密 十六进制加解密
  5. android 蓝牙锁应用开发实例(三)蓝牙相关功能实现【第一部分】
  6. #VCS#关于 simv 可执行返回结果的释义
  7. gitcafe for Eclipse的环境配置
  8. 图像处理中的窗口、核算子、模板、结构、卷积核、高斯核、锚点究竟是什么东西?
  9. 详解Class和MetaClass
  10. 如何用 Java 对 PDF 文件进行电子签章(六)如何进行多次PDF签名 及总结