1. 程式人生 > >python3,windows下的程序監控指令碼

python3,windows下的程序監控指令碼

1  安裝psutil,pip install psutil、

2  檢視程序id,可通過工作管理員檢視

3  cmd下進入指令碼所在路徑

4  執行指令碼(python monitor.py 30658)

5 指令碼所在路徑下,生成監控日誌檔案

指令碼如下:

#coding=utf-8
import sys
import psutil 
import datetime
import time  


def monitor(pid):
    '''
    print psutil.pids() #列出所有的程序id
    p=psutil.Process(10072) #例項化一個程序
    print psutil.pid_exists(10072)
    #print str(p.pid()) #輸出程序id
    print p.name() # 輸出程序名
    print p.status() #輸出程序狀態
    print p.memory_info() #輸出程序記憶體詳細資訊
    print p.memory_info().rss #輸出程序記憶體實際使用資訊
    print p.memory_info().vms #輸出程序虛擬記憶體使用資訊
    print p.connections() #輸出程序socket的namedutples列表,包括fs,family,laddr等資訊
    print p.cpu_percent() #輸出程序的CPU佔用率
    print p.open_files()  #輸出程序的開啟檔案數
    print p.num_handles() #輸出程序的控制代碼數
    print p.num_threads() #輸出程序的執行緒數
    print  p.io_counters() #輸出程序的io讀寫資訊
    '''
    
    #設定監控時間  預設3天
    CYCLE_TIME = datetime.timedelta(weeks=0,days=3,hours=00,minutes=0,seconds=5,microseconds=0,milliseconds=0) #60*60*24
    start_time = datetime.datetime.today()
    #判斷程序是否存在
    if(psutil.pid_exists(pid)):
        p = psutil.Process(pid) #例項化一個程序
        pName = p.name()#程序名
        #設定日誌名
        logName = pName+"_"+str(pid)+"_stress_monitoring_record.log" #log檔案
        logfile = open(logName,"a")
    else:
        print ("pid is not exists please enter true pid!!!")
        return
    wTime = 30#等待時間

    while(True):
        #判定監控時間
        if ((datetime.datetime.today()-start_time)>CYCLE_TIME):
            break
            
        recTime = time.strftime('%Y-%m-%d\t%H:%M:%S',time.localtime(time.time()))#datetime.datetime.today() #記錄時間
        
        #判斷程序是否存在
        if(psutil.pid_exists(pid)):
            vmm = p.memory_info().vms  #虛存 單位位元組
            mm = p.memory_info().rss   #實際使用記憶體 單位位元組
            pCpu = p.cpu_percent(interval=1)      #CPU百分比
            nFiles = len(p.open_files())     #開啟檔案數   這個不太準感覺,暫不記錄
            nThreads = p.num_threads()       #執行緒數
            nHandles = p.num_handles()  #控制代碼數
            #記錄程序詳細資訊
            monitor_content = str(recTime) + "\t" + str(vmm) + "\t" + str(mm) + "\t" + str(pCpu) + "\t" + str(nThreads) + "\t" + str(nHandles)+"\n"
                       
        else:
            monitor_content = str(datetime.datetime.today())+"\t"+str(pid)+"  is not running!!!!!!!!!\n"
            break
            
        print (monitor_content)      
        logfile.flush()
        logfile.write(monitor_content)#寫入log檔案
        time.sleep(wTime)#迴圈等待
        
    logfile.close()    

if __name__ == "__main__":
    #主函式
    if len(sys.argv) < 2:
        print("usage: python monitor.py 程序id");
        sys.exit()        
    pid_str = sys.argv[1]
    pid = int(pid_str)
    monitor(pid)
    pass