使用python脚本来监控进程

简介: 使用python脚本来监控进程

原理:

监控一个指定进程,每隔5秒钟获取其CPU、内存使用量超过60%即kill掉该进程,获取其句柄数,超过300也kill掉该进程

运行环境是windows 64位系统+python 2.7 64位 ,这里需要使用到psutil 类库,要另外安装。脚本里面可以自动安装,前提是你已经下载好了安装包psutil-3.3.0.win-amd64-py2.7.exe

下面看代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import time
from datetime import date, datetime, timedelta
import platform
import os
import win32ui,win32api,win32con,win32gui
import subprocess
def install():
    print("install psutil...")
    sysstr = platform.system()
    if(sysstr =="Windows"):
        print ("Call Windows tasks")
        bit,type=platform.architecture()
        print ("os bit: %s "  % bit)
        #print ("os type: %s "  % type)
        if(bit == "64bit"):
            fileName="psutil-3.3.0.win-amd64-py2.7.exe";
        else:
            fileName="psutil-3.3.0.win32-py2.7.exe";
        print("will install the file [%s]" % fileName)
        
        #启动程序--4种方法
        #subprocess.Popen(fileName); #非阻塞
        #subprocess.Popen(fileName).wati(); #阻塞        
        #os.system(fileName); #阻塞
        #win32api.ShellExecute(0, 'open', fileName, '','',0)
        
        label = 'Setup' #此处假设主窗口名为tt
        hld = win32gui.FindWindow(None, label)        
        count=0
        while (hld == 0 and count<20):
            print("the setup is no running,will run it...")
            count += 1
            win32api.ShellExecute(0, 'open', fileName, '','',0)            
            print("sleep 1 seconds...")
            time.sleep(0.5)
            #wnd = win32ui.GetForegroundWindow()
            #print wnd.GetWindowText()
            hld = win32gui.FindWindow(None, label)
            print("hld is %s" % hld)
        
        pwin=win32ui.FindWindow(None,label)        
        print("pwin is %s" % pwin)
        print pwin.GetWindowText()
        print("click...")
        button2=win32ui.FindWindowEx(pwin,None,None,'下一步(&N) >') #找到按钮 
        button2.SendMessage(win32con.BM_CLICK, 0,-1)
        button2=win32ui.FindWindowEx(pwin,None,None,'下一步(&N) >') #找到按钮 
        button2.SendMessage(win32con.BM_CLICK, 0,-1)
        button2=win32ui.FindWindowEx(pwin,None,None,'下一步(&N) >') #找到按钮 
        button2.SendMessage(win32con.BM_CLICK, 0,-1)
        button2=win32ui.FindWindowEx(pwin,None,None,'完成') #找到按钮 
        button2.SendMessage(win32con.BM_CLICK, 0,-1)
        print("install done...")
        # 鼠标点击
        #print("click...")
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) 
        #time.sleep(0.1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
        #time.sleep(1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) 
        #time.sleep(0.1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
        #time.sleep(1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) 
        #time.sleep(0.1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
        #time.sleep(1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTDOWN,0,0) 
        #time.sleep(0.1)
        #win32api.mouse_event(win32con.MOUSEEVENTF_LEFTUP,0,0)
        
    elif(sysstr == "Linux"):
        print ("Call Linux tasks")
    else:
        print ("Other System tasks")
        
try:
    print("import psutil...")
    import psutil   
except Exception,e:
    print Exception,":",e
    install()
    import psutil
  
def get_proc_by_id(pid):
    return psutil.Process(pid)
def get_proc_by_name(pname):
    """ get process by name
    
    return the first process if there are more than one
    """
    for proc in psutil.process_iter():
        try:
        # return if found one
        if proc.name().lower() == pname.lower():
            return proc
        except psutil.AccessDenied:
            pass
        except psutil.NoSuchProcess:
            pass
    return None
def getProcess(pname, day=0, hour=0, min=0, second=0):   
    # Init time
    now = datetime.now()
    strnow = now.strftime('%Y-%m-%d %H:%M:%S')
    print "now:",strnow
    # First next run time
    period = timedelta(days=day, hours=hour, minutes=min, seconds=second)
    next_time = now + period
    strnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')
    print "next run time:",strnext_time
    while True:
        # Get system current time
        iter_now = datetime.now()
        iter_now_time = iter_now.strftime('%Y-%m-%d %H:%M:%S')      
        if str(iter_now_time) == str(strnext_time):
            next_time = iter_now + period
            strnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')
            print "next run time:",strnext_time
            
            try:
                Process=get_proc_by_name(pname)
            except Exception,e:
              print Exception,":",e
            if Process != None :
                print "-------Found the process : %s" % Process.name();
                print("pid is (%s)" % Process.pid);
                Cpu_usage = Process.cpu_percent(interval=1)
                print("cpu percent is (%s)" % Cpu_usage);
                if (100-Cpu_usage) < 0.1 :
                    print "cpu percent larger 60,now will terminate this process !";
                    Process.terminate();
                    Process.wait(timeout=3);
                    continue
                RAM_percent = Process.memory_percent()
                print("memory percent is (%s)" % RAM_percent);
                if (60-RAM_percent) < 0.1 :
                    print "memory percent larger 60,now will terminate this process !";
                    Process.terminate();
                    Process.wait(timeout=3);
                    continue        
                all_files = list(Process.open_files());
                print("open files size is (%d)" % len(all_files));
                if (len(all_files)>300) :
                    print "open files size larger 300,now will terminate this process !";
                    Process.terminate();
                    Process.wait(timeout=3);
                    continue
                Threads_Num=Process.num_threads()
                print("threads number is (%s)" % Threads_Num); 
                if (Threads_Num>200) :
                    print "threads number larger 200,now will terminate this process !";
                    Process.terminate();
                    Process.wait(timeout=3);
                    continue
            else :
                print "-------No found the process : %s" % pname;
            
            continue
if __name__ == '__main__':
    print("main....")
    getProcess("QQ.exe",second=5)
相关文章
|
3月前
|
安全 网络安全 文件存储
思科设备巡检命令Python脚本大集合
【10月更文挑战第18天】
107 1
思科设备巡检命令Python脚本大集合
|
10天前
|
Python
自动化微信朋友圈:Python脚本实现自动发布动态
本文介绍如何使用Python脚本自动化发布微信朋友圈动态,节省手动输入的时间。主要依赖`pyautogui`、`time`、`pyperclip`等库,通过模拟鼠标和键盘操作实现自动发布。代码涵盖打开微信、定位朋友圈、准备输入框、模拟打字等功能。虽然该方法能提高效率,但需注意可能违反微信使用条款,存在风险。定期更新脚本以适应微信界面变化也很重要。
113 60
|
2月前
|
数据采集 监控 数据挖掘
Python自动化脚本:高效办公新助手###
本文将带你走进Python自动化脚本的奇妙世界,探索其在提升办公效率中的强大潜力。随着信息技术的飞速发展,重复性工作逐渐被自动化工具取代。Python作为一门简洁而强大的编程语言,凭借其丰富的库支持和易学易用的特点,成为编写自动化脚本的首选。无论是数据处理、文件管理还是网页爬虫,Python都能游刃有余地完成任务,极大地减轻了人工操作的负担。接下来,让我们一起领略Python自动化脚本的魅力,开启高效办公的新篇章。 ###
|
17天前
|
存储 运维 监控
探索局域网电脑监控软件:Python算法与数据结构的巧妙结合
在数字化时代,局域网电脑监控软件成为企业管理和IT运维的重要工具,确保数据安全和网络稳定。本文探讨其背后的关键技术——Python中的算法与数据结构,如字典用于高效存储设备信息,以及数据收集、异常检测和聚合算法提升监控效率。通过Python代码示例,展示了如何实现基本监控功能,帮助读者理解其工作原理并激发技术兴趣。
50 20
|
30天前
|
数据采集 存储 监控
21个Python脚本自动执行日常任务(2)
21个Python脚本自动执行日常任务(2)
93 7
21个Python脚本自动执行日常任务(2)
|
2月前
|
关系型数据库 MySQL 数据库连接
python脚本:连接数据库,检查直播流是否可用
【10月更文挑战第13天】本脚本使用 `mysql-connector-python` 连接MySQL数据库,检查 `live_streams` 表中每个直播流URL的可用性。通过 `requests` 库发送HTTP请求,输出每个URL的检查结果。需安装 `mysql-connector-python` 和 `requests` 库,并配置数据库连接参数。
137 68
|
20天前
|
数据挖掘 vr&ar C++
让UE自动运行Python脚本:实现与实例解析
本文介绍如何配置Unreal Engine(UE)以自动运行Python脚本,提高开发效率。通过安装Python、配置UE环境及使用第三方插件,实现Python与UE的集成。结合蓝图和C++示例,展示自动化任务处理、关卡生成及数据分析等应用场景。
88 5
|
1月前
|
Android开发 开发者 Python
通过标签清理微信好友:Python自动化脚本解析
微信已成为日常生活中的重要社交工具,但随着使用时间增长,好友列表可能变得臃肿。本文介绍了一个基于 Python 的自动化脚本,利用 `uiautomator2` 库,通过模拟用户操作实现根据标签批量清理微信好友的功能。脚本包括环境准备、类定义、方法实现等部分,详细解析了如何通过标签筛选并删除好友,适合需要批量管理微信好友的用户。
56 7
|
2月前
|
监控 数据挖掘 数据安全/隐私保护
Python脚本:自动化下载视频的日志记录
Python脚本:自动化下载视频的日志记录
|
2月前
|
运维 监控 网络安全
自动化运维的崛起:如何利用Python脚本简化日常任务
【10月更文挑战第43天】在数字化时代的浪潮中,运维工作已从繁琐的手工操作转变为高效的自动化流程。本文将引导您了解如何运用Python编写脚本,以实现日常运维任务的自动化,从而提升工作效率和准确性。我们将通过一个实际案例,展示如何使用Python来自动部署应用、监控服务器状态并生成报告。文章不仅适合运维新手入门,也能为有经验的运维工程师提供新的视角和灵感。
下一篇
开通oss服务