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 =
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 , uptime :: [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.0.0:* LISTEN /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:
username=user
password=
好了,上面说完了supervisor管理进程,下面开始说报警的事,有些时候,进程莫名其妙的退出了,然后又立刻被supervisor给拉起来了,导致了一些问题出现,想立刻知道这个进程已经被重启过了怎么办?这时候 就可以用superlance来了
superlance介绍
superlance就是基于supervisor的事件机制实现的一系列命令行的工具集,它实现了许多supervisor本身没有实现的实用的进程监控和管理的特性,包括内存监控,http接口监控,邮件和短信通知机制等。同样的,superlance本身也是使用python编写的
superlance命令
superlance是一系列命令行工具的集合,其包括以下这些命令:
- httpok
通过定时对一个HTTP接口进行GET请求,根据请求是否成功来判定一个进程是否处于正常状态,如果不正常则对进程进行重启。 - crashmail
当一个进程意外退出时,发送邮件告警。 - memmon
当一个进程的内存占用超过了设定阈值时,发送邮件告警。 - crashmailbatch
类似于crashmail的告警,但是一段时间内的邮件将会被合成起来发送,以避免邮件轰炸。 - fatalmailbatch
当一个进程没有成功启动多次后会进入FATAL状态,此时发送邮件告警。与crashmailbatch一样会进行合成报警。 - crashsms
当一个进程意外退出时发送短信告警,这个短信也是通过email网关来发送的
.当supervisord启动的时候,如果我们的listener配置为autostart=true的话,listener就会作为supervisor的子进程被启动。 .listener被启动之后,会向自己的stdout写一个"READY"的消息,此时父进程也就是supervisord读取到这条消息后,会认为listener处于就绪状态。 .listener处于就绪状态后,当supervisord产生的event在listener的配置的可接受的events中时,supervisord就会把该event发送给该listener。 .listener接收到event后,我们就可以根据event的head,body里面的数据,做一系列的处理了。我们根据event的内容,判断,提取,报警等等操作。 .该干的活都干完之后,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..tar.gz
cp sendEmail-v1./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 -
然后看一下supervisor
此时 nginx pid已经变化,说明kill之后 又被拉起来了。
也很快 就收到邮件报警了。嘿嘿。。
写这篇文章,在加上实战操作也都一小时了。。。中午都忘了吃饭了.....
好了,就到这里了, 全过程我是实战的一遍的,此方法绝对可行,只要按照我做的去配置,那就没问题。。
前几天搞了个vps 又弄了个博客。。。嘿嘿 以后就博客园 自己博客都同步起来。各位大佬不要喷我,来点访问量 : ) 地址:http://www.binglansky.com
supervisor管理进程 superlance对进程状态报警的更多相关文章
- Supervisor 管理进程,Cloud Insight 监控进程,完美!
Supervisor 是由 Python 语言编写.基于 linux 操作系统的一款服务器管理工具,用于监控服务器的运行,发现问题能立即自动预警及自动重启等. Cloud Insight 是一款次世代 ...
- Linux服务:使用Supervisor管理进程
一.简介 由于基本每个公司都会用到supervisor这个进程管理工具,这里简单阐述一下. Supervisor (http://supervisord.org) 是一个用Python写Linux下的 ...
- Supervisor管理进程
Supervisor管理进程 转载 2016年04月14日 18:26:45 标签: supervisord 28344 Supervisor重新加载配置启动新的进程 liaojie 发布于 1年前, ...
- supervisor管理进程工具配置
Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统 ...
- Django与supervisor 管理进程
1.前言 在Django项目中,我们需要用到一些独立于Django框架外的脚本.这样一些脚本可能需要独立的持续运行,且具有很强的可维护性,这个时候supervisor就可以排上用场了. 基于pytho ...
- 在Docker里使用(支持镜像继承的)supervisor管理进程(转)
这篇文章是受 dockboard 之托帮忙翻译的与 docker 有关的技术文章.译自 Using Supervisor with Docker to manage processes (suppor ...
- php使用supervisor管理进程脚本
supervisor是用python开发的一个在linux系统下的进程管理工具,可以方便的监听,启动,停止一个或多个进程.当一个进程被意外杀死后,supervisor监听到后,会自动重新拉起进程. 一 ...
- pm2 代替 Supervisor 管理进程
前提 我们在使用 Laravel 的时候不免用到列队来处理任务,而 Laravel 官方文档给出的是 Supervisor 来管理进程和监控.但是我们在使用中有下面几个缺点: Supervisor 单 ...
- 使用 supervisor 管理进程
安装: # yum install python-setuptools # easy_install supervisor 如果已经安装了epel和python-pip, 也可以简单 pip inst ...
随机推荐
- 转:C# 深入理解堆栈、堆在内存中的实现
尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(GarbageCollection),但是我们还是应该了解它们,以优化我们的应用程序.同时,还需要具备一些基础的内存管理工作机制 ...
- git命令:全局设置用户名邮箱配置
1.查看git配置信息 git config --list 2.查看git用户名 git config user.name 3.查看邮箱配置 git config user.email 4.全局配置用 ...
- ffmpeg常用参数一览表
基本选项: -formats 输出所有可用格式 -f fmt 指定格式(音频或视频格式) -i filename 指定输入文件名,在linux下当然也能指定:0.0(屏幕录制)或摄像头 -y 覆盖已有 ...
- ArcGIS js api 手动构建FeatureLayer
坐标系 var spatialReference = new SpatialReference(4326);1要素坐标点 var pointArr = [ new Point(116.94431351 ...
- Oracle Database(rdbms) 12.2 安装组件
1. 工具用法 su - oracle $ $(orabasehome)/perl/bin/perl $ORACLE_HOME/rdbms/admin/catcon.pl Usage: catcon ...
- go变量和常量
一.变量 1. 命名规则:字母或者_下划线开头 2.“:=” 这种模式只能用于函数内部,常量const不能用这种模式来定义 二.常量 1. 常量const必须在定义的时候就赋值 2. 常量的值在整个过 ...
- 当我们跑SparkSQL时候为了更好地了解SparkSQL运行,可以WEBUI看SQL的Tab
- Odoo附件传输
转载请注明原文地址:https://www.cnblogs.com/cnodoo/p/9307319.html 一:odoo后端上传附件 odoo中的ir.attachment模型是附件模型,可以用 ...
- rest_framework源码分析
CBV&APIView '''原生django as_view方法''' class View(object): http_method_names = ['get', 'post', 'pu ...
- CentOS中安装Azkaban 2.5
必备软件 yum install git -y 单机安装步骤 git clone https://github.com/azkaban/azkaban.git cd azkaban; ./gradle ...