Python进程监控-MyProcMonitor
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的更多相关文章
- 【321】python进程监控:psutil
参考:Python进程监控-MyProcMonitor 参考:Python3.6 安装psutil 模块和功能简介 参考:psutil module (Download files) 参考:廖雪峰 - ...
- linux 进程监控
linux 进程监控 supervise Supervise是daemontools的一个工具,可以用来监控管理unix下的应用程序运行情况,在应用程序出现异常时,supervise可以重新启动指定程 ...
- python进程池剖析(一)
python中两个常用来处理进程的模块分别是subprocess和multiprocessing,其中subprocess通常用于执行外部程序,比如一些第三方应用程序,而不是Python程序.如果需要 ...
- Mac下Supervisor进程监控管理工具的安装与配置
Supervisor是一个类 unix 操作系统下的进程监控管理工具. Supervisor是由 Python 写成,可用 Python 的包安装管理工具 pip(Python Package Ind ...
- python系统监控及邮件发送
python系统监控及邮件发送 #psutil模块是一个跨平台库,能轻松实现获取系统运行的进程和系统利用率 import psutil ...
- python——进程基础
我们现在都知道python的多线程是个坑了,那么多进程在这个时候就变得很必要了.多进程实现了多CPU的利用,效率简直棒棒哒~~~ 拥有一个多进程程序: #!/usr/bin/env python #- ...
- 【SFTP】使用Jsch实现Sftp文件下载-支持断点续传和进程监控
参考上篇文章: <[SFTP]使用Jsch实现Sftp文件下载-支持断点续传和进程监控>:http://www.cnblogs.com/ssslinppp/p/6248763.html ...
- python多线程监控指定目录
import win32file import tempfile import threading import win32con import os dirs=["C:\\WINDOWS\ ...
- 使用gdb调试Python进程
使用gdb调试Python进程 有时我们会想调试一个正在运行的Python进程,或者一个Python进程的coredump.例如现在遇到一个mod_wsgi的进程僵死了,不接受请求,想看看究竟是运行到 ...
随机推荐
- BZOJ1013 JSOI2008 球形空间产生器sphere 【高斯消元】
BZOJ1013 JSOI2008 球形空间产生器sphere Description 有一个球形空间产生器能够在n维空间中产生一个坚硬的球体.现在,你被困在了这个n维球体中,你只知道球面上n+1个点 ...
- 防范DDoS攻击的几种方式
一.拒绝服务攻击的发展: 从拒绝服务攻击诞生到现在已经有了很多的发展,从最初的简单Dos到现在的DdoS.那么什么是Dos和DdoS呢?DoS是一种利用单台计算机的攻击 方式.而DdoS(Distri ...
- Sprint第一个冲刺(第八天)
一.Sprint介绍 完善点餐界面,点击进行跳转. 实验截图: 任务进度: 二.Sprint周期 看板: 燃尽图:
- ASP.NET性能优化原则
从哪些方面对asp.net进行性能优化,本文作了详细的阐述,希望对大家有所帮助. 一.SqlDataRead和Dataset的选择Sqldataread优点:读取数据非常快.如果对返回的数据不需做大量 ...
- VS 2013 简体中文 专业版 下载地址。
官方原始链接:http://download.microsoft.com/download/7/A/C/7AC27F37-FDFE-4991-B18A-962E26E31BD1/VS2013_RTM_ ...
- python模块--随机模块
import random print(random.random()) # 随机产生一个(0,1)的 float 0.026244299361600776 print(random.randint( ...
- nginx grpc 试用
1. 编译 wget https://nginx.org/download/nginx-1.13.10.tar.gz tar xvf nginx-1.13.10.tar.gz cd nginx-1.1 ...
- Mybatis新增返回主键的两种方法 (mysql)
1.自增:LAST_INSERT_ID (自动返回最后一个INSERT或 UPDATE 问询为 AUTO_INCREMENT列设置的第一个 发生的值.) <!-- mysql的自增ID :LAS ...
- Linux 之 hugepage 大页内存理论
HugePages是通过使用大页内存来取代传统的4kb内存页面,使得管理虚拟地址数变少,加快了从虚拟地址到物理地址的映射以及通过摒弃内存页面的换入换出以提高内存的整体性能.尤其是对于8GB以上的内存以 ...
- 561. 数组拆分 I
题目 python class Solution: def arrayPairSum(self, nums): """ :type nums: List[int] :rt ...