zoukankan      html  css  js  c++  java
  • supervisor管理进程 superlance对进程状态报警

    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的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。

    配置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
    

     

    下面创建一个nginx的配置文件

    [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

    来启动supervisor

    supervisord -c /etc/supervisor/supervisord.conf 

    刚开始有个坑,command = /usr/local/nginx/sbin/nginx 我是这样写的 结果就一直启动nginx 因为这样的话 是后台运行的nginx,然而supervisor 不能管理后台运行进程,所以把nginx daemon off 守护关掉,就让他阻塞在前台bash运行,方便supervisor来管理。

    [root@test /]# supervisorctl status
    nginx                            RUNNING   pid 17541, uptime 0:03:42
     
    [root@test /]# netstat -ntlp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name    
    tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      17541/nginx: master 

    此时nginx PID是一致的。

    常用supervisorctl命令

    supervisorctl status    查看当期进程状态
    supervisorctl stop <name>  停止一个进程
    supervisorctl start <name>  启动
    supervisorctl restart <name> 重启
    supervisorctl reload     重启supervisord主进程

    web界面管理

    开启web访问

    vim /etc/supervisor/supervisord.conf
      [inet_http_server]        
      port=0.0.0.0:9001       
      username=user            
      password=123   


    好了,上面说完了supervisor管理进程,下面开始说报警的事,有些时候,进程莫名其妙的退出了,然后又立刻被supervisor给拉起来了,导致了一些问题出现,想立刻知道这个进程已经被重启过了怎么办?这时候 就可以用superlance来了

    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

    既然有了上面的event特性,下面就配置一个发邮件报警,当nginx莫名其妙的重启后 就立刻发邮件通知。

    这里在说一下,centos下如何用命令行直接发邮件的,我一直都没有用过默认 自带的,也不好用。推荐一个比较好用的。

    sendEmail,用perl语言写好的 也都封装好了,只需要提供发件人 邮箱账号 密码 smtp服务 收件人 就可以了。

    先配置一下

    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
     

    ok,发邮件测试一下,这里我把邮箱信息隐藏一下了.....

    sendemail -f 发件人邮箱 -t 收件人邮箱 -s 发件人邮箱smtp服务器 -u "sendEmail" -m "haha" -xu 发件人邮箱 -xp 发件人邮箱密码 
     
    -f 发件人
    -t 收件人
    -s 发件人smtp服务器
    -u 主题
    -m 内容
    -xu 发件人用户名
    -xp 发件人密码
     

    我这里用的163发的 qq邮箱收件的,测试没啥问题的。

    ok 现在要做的就是配置一个supervisor配置文件,来一直监听进程的状态变化

    [root@test /]# cat /etc/supervisor/config.d/mail.conf 
    [eventlistener:crashmail-exited]
    command=crashmail -a -s "/usr/bin/sendemail -f xxxxxx@163.com -t xxxxxx@qq.com -s smtp.163.com -u 'nginx' -xu xxxxxxx@163.com -xp xxxxxxxx -m" -m xxxxxxxx@qq.com
    events=PROCESS_STATE_EXITED
    redirect_stderr=false
    

      

    添加好一个进程配置文件后,supervisorctl reload 重启一下

    已经是两个进程在running了

    下面测试一下 kill 掉nginx进程

     ps aux | grep nginx
     kill -9 17659 17660 
     

    然后看一下supervisor

    此时 nginx pid已经变化,说明kill之后 又被拉起来了。

    也很快 就收到邮件报警了。嘿嘿。。

    写这篇文章,在加上实战操作也都一小时了。。。中午都忘了吃饭了.....

    好了,就到这里了, 全过程我是实战的一遍的,此方法绝对可行,只要按照我做的去配置,那就没问题。。

    前几天搞了个vps  又弄了个博客。。。嘿嘿  以后就博客园 自己博客都同步起来。各位大佬不要喷我,来点访问量  : ) 地址:http://www.binglansky.com

  • 相关阅读:
    bootstrap treevie只展开一个节点,关闭其他节点
    Java后端校验-使用hibernate-validator校验JavaBean
    js生成Excel文件
    Databus&canal对比
    KVM安装配置笔记
    机器学习之数学基础一导数
    机器学习-线性回归
    机器学习之数学基础一统计
    Leader与Boss,技术leader与管理者
    php递归获取无限分类菜单
  • 原文地址:https://www.cnblogs.com/binglansky/p/9246780.html
Copyright © 2011-2022 走看看