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

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

  1. 【321】python进程监控:psutil

    参考:Python进程监控-MyProcMonitor 参考:Python3.6 安装psutil 模块和功能简介 参考:psutil module (Download files) 参考:廖雪峰 - ...

  2. linux 进程监控

    linux 进程监控 supervise Supervise是daemontools的一个工具,可以用来监控管理unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程 ...

  3. python进程池剖析(一)

    python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...

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

    Supervisor是一个类 unix 操作系统下的进程监控管理工具. Supervisor是由 Python 写成,可用 Python 的包安装管理工具 pip(Python Package Ind ...

  5. python系统监控及邮件发送

    python系统监控及邮件发送   #psutil模块是一个跨平台库,能轻松实现获取系统运行的进程和系统利用率   import psutil                              ...

  6. python——进程基础

    我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...

  7. 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控

    参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html  ...

  8. python多线程监控指定目录

    import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...

  9. 使用gdb调试Python进程

    使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...

随机推荐

  1. Codeforces 1027E Inverse Coloring 【DP】

    Codeforces 1027E Inverse Coloring 题目链接 #include<bits/stdc++.h> using namespace std; #define N ...

  2. 剑指offer第六章

    剑指offer第六章 1.数字在排序数组中出现的次数 统计一个数字在排序数组中出现的次数.例如输入排序数组{1,2,3,3,3,3,4,5}和数字3,由于3在数组中出现了4次,所以输出4 分析:思路1 ...

  3. flask第七篇——URL与视图函数的映射

    有兴趣的朋友可以添加微信公众号:自动化测试实战 今天开始就要进入正题了.大家都准备好了吧~ 代码提示 先和大家说个小知识点:有同学后台说输入flask代码pycharm不提示,现在告诉你一个解决方法: ...

  4. Java中16进制与字符串之间的相互转换

    笔者前几日在开服过程中需要将字符串转化成为16进制的字符串,在网上找到了一些方法尝试之后,均发现存在一个问题-->字符串转为16进制后再转回来,英文正常,中文出现乱码 经过考虑决定通过以下方式进 ...

  5. ubutun Sogou输入法安装

    http://jingyan.baidu.com/article/ad310e80ae6d971849f49ed3.html 文章来自以上链接 安装搜狗输入法 下载搜狗http://pinyin.so ...

  6. vuejs2.0的生命周期解读

    每个 Vue 实例在被创建之前都要经过一系列的初始化过程.例如,实例需要配置数据观测(data observer).编译模版.挂载实例到 DOM ,然后在数据变化时更新 DOM .下图展示的就是一个v ...

  7. git仓库

    关于仓库,我们先搞清楚三个概念:本地仓库.远程仓库和上游仓库.本地仓库是从远程仓库clone出来的,远程仓库可以从上游仓库fork出来.这里的clone和fork都是复制的意思,区别是本地和远程都是针 ...

  8. Apache的下载安装(主要说的 64位)及问题

    本文转载自:http://blog.csdn.net/qq_15096707/article/details/47319545 今天重装完win10系统,就重新下载安装 Apache.虽说之前有安装过 ...

  9. Android插件化初识

    含义:可以简单理解为将一个app分为多个小的app,其中有一个为宿主app. 解决的主要问题:代码加载.资源加载. 插件的方式:apk安装,apk不安装,dex包 插件化的优点: 1) 模块解耦,应用 ...

  10. Java运算符 逻辑运算符 短路运算符

    &      与 两个运算数都为真时结果为真,只要有一个运算数为假结果就为假,否则就为真. true & true = true   true & false = false ...