Python进程监控-MyProcMonitor

psutil api文档:

http://pythonhosted.org/psutil/

配置:

process:
  name:  ProxyTool.exe
  path:  E:\Project\ProxyTool.exe

rules:

  p_cpu_percent:  100
  #t_cpu_percent:  20
  #cpu_times:  30
  #num_threads:  15
  #connections:  20

noporcesssleeptime:  3
getprocinfotimespan:  3
cpupercentinterval:  1

config.yaml

转换exe

#! /usr/bin/env python
# coding=utf-8

‘‘‘
Created on 2015.10.12

@author: ryhan
‘‘‘

import os

# 以下代码解决输出乱码问题
import sys
# print sys.getdefaultencoding()
reload(sys)
sys.setdefaultencoding(‘utf-8‘)
# print sys.getdefaultencoding()

Py_Installer_Path=‘D:\pyinstaller-develop‘
Py_FilePATH = "%s\\" % (os.path.dirname(os.path.realpath(__file__)),)
Py_FileList=[‘MyProcMonitor‘]

# print Py_FilePATH

os.chdir(Py_Installer_Path)

for fname in Py_FileList:

    #cmd=‘python pyinstaller.py --upx-dir=D:\pyinstaller-develop\upx391w -F %s%s.py‘ % (Py_FilePATH,fname)
    #upx.exe 放入到python安装路径下 如果不想使用upx,需要添加参数 --noupx
    cmd=‘python pyinstaller.py -F %s%s.py‘ % (Py_FilePATH,fname)
    print cmd
    os.system(cmd)

    cmd=‘copy /y %s\%s\dist\%s.exe %s‘ % (Py_Installer_Path,fname,fname,Py_FilePATH)
    print cmd
    os.system(cmd)

BulidExe

主程:

#! /usr/bin/env python
# coding=utf-8

import psutil
# print psutil.test()

import functools
import yaml
import json
import time
import os

from pylog import logger

def log(func):
    @functools.wraps(func)
    def wrapper(*args, **kw):

        logger.debug(u‘---- Invoke : %s ----‘ , func.__name__)   

        return func(*args, **kw)
    return wrapper

class Monitor():

    @log
    def __init__(self):

        self.confd = yaml.load(file(‘config.yaml‘))
        logger.debug(‘yaml:%s‘, self.confd)

        if(self.confd == None or self.confd.get(‘process‘) == None or self.confd.get(‘rules‘) == None or len(self.confd.get(‘rules‘)) == 0):
            raise ValueError(‘please check config.yaml~! (key: confprocess or rules)‘)   

        self.confprocname = self.confd.get(‘process‘, ‘{}‘).get(‘name‘, ‘‘)
        self.confprocpath = self.confd.get(‘process‘, ‘{}‘).get(‘path‘, ‘‘)
        self.confrules = self.confd.get(‘rules‘)        

        self.noporcesssleeptime = self.confd.get(‘noporcesssleeptime‘, 3)
        self.getprocinfospantime = self.confd.get(‘getprocinfotimespan‘, 1)
        self.cpupercentinterval = self.confd.get(‘cpupercentinterval‘, 1)

    @log
    def __loadProcess(self):

        self.monitorproc = None

        try:
            for p in psutil.process_iter():
#                 pinfo = p.as_dict(attrs=[‘pid‘, ‘name‘])

#             for pid in psutil.pids():
#                 p = psutil.Process(pid)

                if p.name() == self.confprocname:
                    self.monitorproc = p
                    break

            if(self.monitorproc):
                logger.info(‘Findprocess %s: id:%s ‘, self.confprocname, self.monitorproc.pid)
            else:
                logger.info(‘Do Not Find Porcess ! Please Check~!‘)                

        except Exception, e:
                logger.debug(e)

        return self.monitorproc                    

    @log
    def loopControl(self):

        logger.info(‘Begin while loop!‘)

        finprocessloop = 1

        while 1:
            try:
                while finprocessloop:
                    if(not self.__loadProcess()):
                        time.sleep(self.noporcesssleeptime)
                        continue
                    else:
                        finprocessloop = 0

                args = self.__getProcInfo()
                if args and args[0]:
                    self.__checkProc(*args)
                else:
                    logger.info(‘Missing Process Control: %s !‘, self.confprocname)
                    finprocessloop = 1

                    time.sleep(self.getprocinfospantime)

            except Exception, e:
                logger.debug(‘loopControl.while :%s‘, e)

    @log
    def __getProcInfo(self):    

        try:
            p = self.monitorproc
            pinf = {}            

            pinf[‘id‘] = p.pid
            pinf[‘name‘] = p.name()
#             pinf[‘exe‘] = p.exe()
            pinf[‘num_threads‘] = p.num_threads()
            pinf[‘num_handles‘] = p.num_handles()
            pinf[‘threads‘] = p.threads()
            pinf[‘connections‘] = p.connections()
            pinf[‘memory_percent‘] = p.memory_percent()
            pinf[‘memory_info‘] = p.memory_info()
            pinf[‘cpu_affinity‘] = p.cpu_affinity()
            pinf[‘cpu_times‘] = p.cpu_times()
            pinf[‘p_cpu_percent‘] = p.cpu_percent(interval=self.cpupercentinterval)
            pinf[‘t_cpu_percent‘] = psutil.cpu_percent(interval=self.cpupercentinterval)
            pinf[‘cpu_count_real‘] = psutil.cpu_count()
            pinf[‘cpu_count_logical‘] = psutil.cpu_count(logical=False)       

            cpu_count_real = pinf[‘cpu_count_real‘]
            cpu_count_logical = pinf[‘cpu_count_logical‘]
            p_cpu_percent = pinf[‘p_cpu_percent‘]
            t_cpu_percent = pinf[‘t_cpu_percent‘] 

            logger.debug(‘pinfo:%s‘, pinf)
#             logger.debug(‘p_cpu_percent:%s‘, p_cpu_percent)
#             logger.debug(‘t_cpu_percent:%s‘, t_cpu_percent)

            return (True, p_cpu_percent, t_cpu_percent, cpu_count_real, cpu_count_logical)

        except Exception, e:
            logger.debug(e)
            return (False, 0, 0, 0, 0)

    @log
    def __checkProc(self, isparmvalid, proc_cpu_percent, total_cpu_percent, cpu_count_real, cpu_count_logical):

        try:

            logger.debug(‘args => pid:%s, pname:%s, isparmvalid:%s, p_u_percent:%s,p_u_t_percent:%s, t_u_percent:%s, u_r_count:%s, u_l_count:%s‘                         , self.monitorproc.pid, self.monitorproc.name(), isparmvalid, proc_cpu_percent, proc_cpu_percent / cpu_count_real, total_cpu_percent, cpu_count_real, cpu_count_logical)

            if  isparmvalid:

                conf_p_cpu_percent = self.confrules.get(‘p_cpu_percent‘, 100)

                if proc_cpu_percent > conf_p_cpu_percent:
#                     p.send_signal(signal.SIGTERM)
                    logger.info(‘judge=> proc_cpu_percent[%s] > conf_p_cpu_percent[%s]. Now kill %s %s  ‘, proc_cpu_percent, conf_p_cpu_percent, self.monitorproc.pid, self.monitorproc.name())
                    self.monitorproc.terminate()
                else:
                    logger.info(‘judge=> proc_cpu_percent[%s] < conf_p_cpu_percent[%s]. Keep Watch %s %s  ‘, proc_cpu_percent, conf_p_cpu_percent, self.monitorproc.pid, self.monitorproc.name())

        except Exception, e:
            logger.debug(e)        

if __name__ == ‘__main__‘:

    try:
        m = Monitor()
        m.loopControl()        

    except Exception, e:
        logger.debug(e)             

MyProcMonitor

日志:

#! /usr/bin/env python
# coding=utf-8

import logging
import logging.handlers  

# NOTSET < DEBUG < INFO < WARNING < ERROR < CRITICAL
# CRITICAL > ERROR > WARNING > INFO > DEBUG > NOTSET

# logging初始化工作
# logging.basicConfig()

# create logger
logger = logging.getLogger(‘tst‘)
logger.setLevel(logging.DEBUG)

# create console handler and set level to debug
consolehandler = logging.StreamHandler()
consolehandler.setLevel(logging.INFO)

# filehandler = logging.handlers.RotatingFileHandler(‘run.log‘, maxBytes=1024 * 1024, backupCount=5)
filehandler = logging.handlers.TimedRotatingFileHandler(‘run‘, when=‘H‘, interval=1, backupCount=1)
filehandler.suffix = "%Y%m%d-%H%M.log"
filehandler.setLevel(logging.DEBUG)

# create formatter
formatter = logging.Formatter(‘%(asctime)s - %(message)s‘)

# add formatter to handler
consolehandler.setFormatter(formatter)
filehandler.setFormatter(formatter)  # 为handler添加formatter

# add handler to logger
logger.addHandler(consolehandler)
logger.addHandler(filehandler)

pylog

时间: 2024-10-07 22:32:52

Python进程监控-MyProcMonitor的相关文章

python进程监控

1 # -*- coding:utf-8 -*- 2 import subprocess,time,sys 3 import os 4 os.system("title 监控:自动签到1".decode('UTF-8').encode('GBK')) 5 TIME = 1 #程序状态检测间隔(单位:分钟) 6 CMD = "4399.py" #需要执行程序的绝对路径,支持jar 如:D:\\calc.exe 或者D:\\test.jar 7 8 9 10 class

用Python的Supervisor进行进程监控以及自动启动

做服务器端开发的同学应该都对进程监控不会陌生,最近恰好要更换 uwsgi 为 gunicorn,而gunicorn又恰好有这么一章讲进程监控,所以多研究了下. 结合之前在腾讯工作的经验,也会讲讲腾讯的服务器监控是怎么做的.同时也会讲下小团队又该怎么敏捷的解决. 下面按照监控的方法依次介绍. 一.按照进程名监控 在腾讯内部所有server都是要打包发布的,而在打包过程中是需要填写要监控的进程名,然后在crontab中定时通过ps查询进程是否存在. 这种方法是比较简单的方法,但是考虑到很多进程会在启

python进程池剖析(一)

python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要实现调用外部程序的功能,python的psutil模块是更好的选择,它不仅支持subprocess提供的功能,而且还能对当前主机或者启动的外部程序进行监控,比如获取网络.cpu.内存等信息使用情况,在做一些自动化运维工作时支持的更加全面.multiprocessing是python的多进程模块,主要

linux 进程监控

linux 进程监控 monit monit是一个小型的开放源码工具来管理和监控Unix系统.Monit可以自动维护进程,及时避免进程异常退出等产生的问题. 系统: monit可以监控问题的发生,包括进程状态.系统cpu负载.内存占用情况等,例如当apache服务的cpu负载以及内存闸弄情况过高时候,它会重启apache服务. 进程: monit可以监控守护进程,包括系统进程.例如当某个进行down掉,它会自动恢复重启该进程. 文件系统:Monit可以监控本地文件.目录.文件系统的变化,包括时间

Mac下Supervisor进程监控管理工具的安装与配置

Supervisor是一个类 unix 操作系统下的进程监控管理工具. Supervisor是由 Python 写成,可用 Python 的包安装管理工具 pip(Python Package Index) 直接安装 代码如下: sudo pip install supervisor 配置 Supervisor Supervisor 的配置文件命名为 supervisord.conf,它为 supervisord(Supervisor 的主服务命令) 和 supervisorctl(Superv

使用 gdb 调试运行中的 Python 进程

本文和大家分享的是使用 gdb 调试运行中的 Python 进程相关内容,一起来看看吧,希望对大家学习python有所帮助. 准备工作 安装 gdb 和 python2.7-dbg: $ sudo apt-get install gdb python2.7-dbg 设置 /proc/sys/kernel/yama/ptrace_scope: $ sudo su# echo 0 > /proc/sys/kernel/yama/ptrace_scope 运行 test.py: $ python te

Linx监控分享--重点进程监控(mysqld)+邮件提醒

重点进程监控 mysqld:进程退出了,报警.没有退出则监控mysqld的(cpu(>=100%)|| mem(>=80%))开始提醒,同时收集和分析mysql状态信息:连接数(>=max_connections * 0.8)开始提醒:打开的句柄数(>=8192*0.8?)开始提醒. 待完善... 如果是单机多实例的话,只需要增加一个for循环就好了. 在手机上安装网易的邮件客户端,就可以达到实时提醒的效果. 关于mail的配置,见之前的文章:http://blog.csdn.ne

使用python程序监控云服务器的带宽

将一些不重要的服务迁移到云服务上,有些下载什么的,为了防止带宽超了,python做了一个监控程序.用python3写的,由于和python2有些区别,特记录下来备查. 代码如下: #this is for monitor qingcloud# coding=utf-8import base64import hmacimport urllibimport urllib.parsefrom hashlib import sha256import urllib.requestimport dateti

分析erlang进程监控的实现

Erlang支持Monitor和Link两种监控进程的方式,使得所有进程可以连成一个整体.当某个进程出错退出时,监控进程会收到该进程退出的消息通知.有了这些特点,使用Erlang建立一个简单,并且健壮的系统就不是什么难事.前面有文章分析了两种方式的用法,这里分析下monitor和link的实现. 源码分析 monitor 和link实现有点类似,下面以monitor为例做说明(erlang版本R16B02) erlang:monitor/2的实现 // bif.c 实现 erlang:monit