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
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