利用Supervisor进行进程状态监控和报警
2017-12-12 10:06
676 查看
http://www.300168.com/yunwei/show-7897.html
Supervisord是一个使用Python编写的进程管理工具。可以监控和管理进程的状态,管理进程的日志,在程序异常退出时自动重启进程。
Supervisord工具包含两个命令:
supervisord:supervisor的服务程序。
supervisorctl:控制被supervisor管理的进程的命令行工具。
安装Supervisord:
可以通过以下途径安装Supervisord:
包管理器:yum install python-setuptools,apt-get install supervisor。
pip:pip install supervisor。
easy_install:easy_install supervisor。
通过源代码安装。
生成supervisord的配置文件:
echo_supervisord_conf > /etc/supervisord.conf
配置supervisord:
在supervisord.conf最后增加(分号后边的表示注释):
[program:bandwidth]
command=python26 /usr/local/bin/bandwidth.sh
user =root
autostart=true
autorestart=true
startsecs=3
stderr_logfile=/tmp/bandwidth_err.log
stdout_logfile=/tmp/bandwidth.log
详细的配置说明请参考: http://supervisord.org/configuration.html
运行supervisord:
supervisord -c /path/to/supervisord.conf
利用Supervisord进行进程监控和报警
利用Supervisord进行进程监控和报警主要的利用Supervisord的Event特性,编写一个listener,监控进程状态的改变,然后执行指定的代码。
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的进程组
详细的Event特性请参考: http://supervisord.org/events.html
我们可以利用Supervisord的特性监控进程并报警,如当进程异常退出时报警,或当进程产生错误输出是报警。
编写程序,示例程序监控进程的异常退出和错误日志输出:
#!/usr/bin/env python
#coding=utf-8
Suprevisord Listener example.
'''
import sys
import os
def write_stdout(s):
sys.stdout.write(s)
sys.stdout.flush()
def write_stderr(s):
sys.stderr.write(s)
sys.stderr.flush()
def baojing(msg=None, data=None):
if msg == None and data == None:
return
tmp = data.split('\n')
pheaders = dict([ x.split(':') for x in tmp[0].split() ])
pdata = None
if len(tmp) > 1:
pdata = tmp[1]
return pheaders, pdata
def main():
#Only supervisord can run this listener, otherwise exit.
if not 'SUPERVISOR_SERVER_URL' in os.environ:
print "%s must be run as a supervisor listener." % sys.argv[0]
return
if name == 'main':
main()
其中报警函数可以自行拓展,如利用sendmail发邮件报警,利用微信接口实现微信报警或利用短信接口进行短信报警等。
配置Supervisord
Supervisord的listener是作为一个Supervisord管理的进程一直运行的,接受Supervisord的控制,其配置项和program的配置有些相信。往Supervisord的配置文件中添加如下配置:
[eventlistener:listener]
command = /usr/bin/python /path/to/listener.py
process_name = %(program_name)s
autostart = true
autorestart = unexpected
startretries = 10
startsecs = 10
stopwaitsecs = 120
user = zhyaof
events = PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR
stopsignal = TERM
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 5
stdout_logfile = /home/ma45/var/log/supervisord/listener.stdout.log
stderr_logfile_maxbytes = 50MB
stderr_logfile_backups = 5
stderr_logfile = /home/ma45/var/log/supervisord/listener.stderr.log
注意:
如果需要监听进程的日志输出,包括标准输出和标准错误输出,需要在被监控程序的配置项中添加:
stdout_events_enabled = true
stderr_events_enabled = true
如果需要监听进程的PROCESS_COMMUNICATION时间,包括PROCESS_COMMUNICATION_STDOUT和PROCESS_COMMUNICATION_STDERR,需要在被监控程序的配置项中添加:
stdout_capture_maxbytes = 1MB
stderr_capture_maxbytes = 1MB
其中1MB的大小可以根据实际情况进行改动。
原文: 利用Supervisor进行进程状态监控和报警
Supervisord是一个使用Python编写的进程管理工具。可以监控和管理进程的状态,管理进程的日志,在程序异常退出时自动重启进程。
Supervisord工具包含两个命令:
supervisord:supervisor的服务程序。
supervisorctl:控制被supervisor管理的进程的命令行工具。
安装Supervisord:
可以通过以下途径安装Supervisord:
包管理器:yum install python-setuptools,apt-get install supervisor。
pip:pip install supervisor。
easy_install:easy_install supervisor。
通过源代码安装。
生成supervisord的配置文件:
echo_supervisord_conf > /etc/supervisord.conf
配置supervisord:
在supervisord.conf最后增加(分号后边的表示注释):
[program:bandwidth]
command=python26 /usr/local/bin/bandwidth.sh
user =root
autostart=true
autorestart=true
startsecs=3
stderr_logfile=/tmp/bandwidth_err.log
stdout_logfile=/tmp/bandwidth.log
详细的配置说明请参考: http://supervisord.org/configuration.html
运行supervisord:
supervisord -c /path/to/supervisord.conf
利用Supervisord进行进程监控和报警
利用Supervisord进行进程监控和报警主要的利用Supervisord的Event特性,编写一个listener,监控进程状态的改变,然后执行指定的代码。
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的进程组
详细的Event特性请参考: http://supervisord.org/events.html
我们可以利用Supervisord的特性监控进程并报警,如当进程异常退出时报警,或当进程产生错误输出是报警。
编写程序,示例程序监控进程的异常退出和错误日志输出:
#!/usr/bin/env python
#coding=utf-8
Author zhyaof(mail@zhyaof.net)
'''Suprevisord Listener example.
'''
import sys
import os
def write_stdout(s):
sys.stdout.write(s)
sys.stdout.flush()
def write_stderr(s):
sys.stderr.write(s)
sys.stderr.flush()
def baojing(msg=None, data=None):
if msg == None and data == None:
return
alert
def parseData(data):tmp = data.split('\n')
pheaders = dict([ x.split(':') for x in tmp[0].split() ])
pdata = None
if len(tmp) > 1:
pdata = tmp[1]
return pheaders, pdata
def main():
#Only supervisord can run this listener, otherwise exit.
if not 'SUPERVISOR_SERVER_URL' in os.environ:
print "%s must be run as a supervisor listener." % sys.argv[0]
return
while True: #echo 'READY' and wait for event for stdin. write_stdout('READY\n') line = sys.stdin.readline() # read header line from stdin headers = dict([ x.split(':') for x in line.split() ]) data = sys.stdin.read(int(headers['len'])) # read the event payload if headers['eventname'] == 'PROCESS_STATE_EXITED' or\ headers['eventname'] == 'PROCESS_STATE_FATAL' or\ headers['eventname'] == 'PROCESS_STATE_STOPPED': pheaders, pdata = parseData(data) from_state = pheaders['from_state'] process_name = pheaders['processname'] if headers['eventname'] == 'PROCESS_STATE_EXITED' and\ not int(pheaders['expected']): msg = '进程%s(PID: %s)异常退出,请检查进程状态.'\ % (process_name, pheaders['pid']) baojing(msg=msg) if headers['eventname'] == 'PROCESS_STATE_FATAL': msg = '进程%s启动失败,请检查进程状态.'\ % (process_name) baojing(msg=msg) elif headers['eventname'] == 'PROCESS_LOG_STDERR': pheaders, pdata = parseData(data) process_name = pheaders['processname'] pid = pheaders['pid'] msg = '进程%s(PID: %s)错误输出,请检查进程状态,错误输出信息: %s.' \ % (process_name, pid, pdata) baojing(msg=msg) #echo RESULT write_stdout('RESULT 2\nOK') # transition from READY to ACKNOWLEDGED
if name == 'main':
main()
其中报警函数可以自行拓展,如利用sendmail发邮件报警,利用微信接口实现微信报警或利用短信接口进行短信报警等。
配置Supervisord
Supervisord的listener是作为一个Supervisord管理的进程一直运行的,接受Supervisord的控制,其配置项和program的配置有些相信。往Supervisord的配置文件中添加如下配置:
[eventlistener:listener]
command = /usr/bin/python /path/to/listener.py
process_name = %(program_name)s
autostart = true
autorestart = unexpected
startretries = 10
startsecs = 10
stopwaitsecs = 120
user = zhyaof
events = PROCESS_STATE_EXITED,PROCESS_STATE_STOPPED,PROCESS_STATE_FATAL,PROCESS_LOG_STDERR
stopsignal = TERM
stdout_logfile_maxbytes = 50MB
stdout_logfile_backups = 5
stdout_logfile = /home/ma45/var/log/supervisord/listener.stdout.log
stderr_logfile_maxbytes = 50MB
stderr_logfile_backups = 5
stderr_logfile = /home/ma45/var/log/supervisord/listener.stderr.log
注意:
如果需要监听进程的日志输出,包括标准输出和标准错误输出,需要在被监控程序的配置项中添加:
stdout_events_enabled = true
stderr_events_enabled = true
如果需要监听进程的PROCESS_COMMUNICATION时间,包括PROCESS_COMMUNICATION_STDOUT和PROCESS_COMMUNICATION_STDERR,需要在被监控程序的配置项中添加:
stdout_capture_maxbytes = 1MB
stderr_capture_maxbytes = 1MB
其中1MB的大小可以根据实际情况进行改动。
原文: 利用Supervisor进行进程状态监控和报警
相关文章推荐
- cacti下利用thold插件来进行EMAIL和MSN报警(监控网卡流量大于10兆)
- 【Scrapy学习】 使用supervisor对scrapyd进程进行监控和管理
- 使用Python的Supervisor进行进程监控以及自动启动
- 7Windows系统利用SNMP进行程序进程的监控
- 使用Python的Supervisor进行进程监控以及自动启动
- 使用Python的Supervisor进行进程监控以及自动启动
- 利用shell脚本监控网站状态
- 【原创】监控进程的启动的一种方法利用
- 【mysql】使用脚本对mysql状态进行监控
- 利用Shell脚本对Nginx日志进行监控
- 利用DBMS_SPACE包对Oracle 表碎片进行监控与清理
- mongostat和mongotop对mongodb数据库运行状态进行监控
- 利用python并发模块进行网站的状态检测
- 用JMX对Resin内存状态进行监控
- 使用 Shell 对进程资源进行监控
- Supervisor – 用于 Unix 系统的进程监控工具
- shell脚本监控tomcat服务运行状态,服务关闭后进行重启
- 使用Shell脚本对Linux系统和进程资源进行监控
- Zabbix监控nginx服务进程状态
- 利用WM_COPYDATA进行进程间单向通信