psutil api文档:
http://pythonhosted.org/psutil/
api 测试
#! /usr/bin/env python # coding=utf-8 import psutil # CPU-> Examples # print psutil.cpu_times() # print psutil.cpu_count() # print psutil.cpu_count(logical=False) # # for x in range(3): # print psutil.cpu_percent(interval=1) # print psutil.cpu_percent(interval=1, percpu=True) # print psutil.cpu_times_percent(interval=1, percpu=False) # Memory-> Examples: # print psutil.virtual_memory() # print psutil.swap_memory() # Disks-> Examples: # print psutil.disk_partitions() # print psutil.disk_usage('/') # print psutil.disk_io_counters(perdisk=False) # Networks-> Examples: # print psutil.net_io_counters(pernic=True) # print psutil.net_connections() # Other system info-> Examples: # print psutil.users() # print psutil.boot_time() # Process Management-> Examples: print psutil.pids() for i in psutil.pids(): p = psutil.Process(i) # print p.name(), p.cpu_percent(interval=1.0) # print p.name() # print p.cmdline() # print p.exe() # print p.cwd() # print p.status() # print p.username() # print p.create_time() # print p.terminal() # print p.uids() # print p.gids() # print p.cpu_times() # print p.cpu_percent(interval=1.0) # print p.cpu_affinity() # print p.cpu_affinity([0]) # print p.memory_percent() # print p.memory_info() # print p.ext_memory_info() # print p.memory_maps() # print p.io_counters() # print p.open_files() # print p.connections() # print p.num_threads() # print p.num_fds() # print p.threads() # print p.num_ctx_switches() # print p.nice() # print p.nice(10) # print p.ionice(psutil.IOPRIO_CLASS_IDLE) # IO priority (Win and Linux only) # print p.ionice() # print p.rlimit(psutil.RLIMIT_NOFILE, (5, 5)) # set resource limits (Linux only) # print p.rlimit(psutil.RLIMIT_NOFILE) # print p.suspend() # print p.resume() # print p.terminate() # print p.wait(timeout=3) print psutil.test()
配置:
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
转换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)
主程:
#! /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)
日志:
#! /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)