python进程监控 supervisor_利用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进行进程状态监控和报警

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值