supervisor管理进程 superlance对进程状态报警
supervisor介绍
首先,介绍一下supervisor。Supervisor(http://supervisord.org/)是用Python开发的一个client/server服务,是Linux/Unix系统下的一个进程管理工具,不支持Windows系统。它可以很方便的监听、启动、停止、重启一个或多个进程。用Supervisor管理的进程,当一个进程意外被杀死,supervisort监听到进程死后,会自动将它重新拉起,很方便的做到进程自动恢复的功能,不再需要自己写shell脚本来控制
之所以写这篇文章,是前两天的一个需求。。。哎 没办法 运维狗....
环境:centos7.4
安装supervisor
1 |
|
因为是python开发的一个库,可以直接用pip来安装,很方便。
supervisor安装完成后会生成三个执行程序:supervisortd、supervisorctl、echo_supervisord_conf,分别是supervisor的守护进程服务(用于接收进程管理命令)、客户端(用于和守护进程通信,发送管理进程的指令)、生成初始配置文件程序。
配置supervisor
创建目录,初始化配置文件
|
主配置文件参数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
|
管理一个进程
把所有被管理的进程配置文件都放在同一个目录,主配置文件包含进去。
|
下面创建一个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来管理。
[[email protected] /]# supervisorctl status nginx RUNNING pid 17541, uptime 0:03:42 [[email protected] /]# 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网关来发送的
- httpok
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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
|
安装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配置文件,来一直监听进程的状态变化
1 2 3 4 5 |
|
添加好一个进程配置文件后,supervisorctl reload 重启一下
已经是两个进程在running了
下面测试一下 kill 掉nginx进程
ps aux | grep nginx kill -9 17659 17660
然后看一下supervisor
此时 nginx pid已经变化,说明kill之后 又被拉起来了。