python监控linux运行程序_linux下的系统监控程序(Python+wxPython)

importthreading,re,time,sys,osfromsubprocessimport*fromshleximportsplit#global Variablesprev_cpu_info={"user":0,"system":0,"idle":0,"iowait":0}

cpu_stat=[]

prev_partition_info=[]

HZ=100SLEEP_TIME=3prev_net_info={"in":0,"out":0}classSysMonitor(threading.Thread):def__init__(self,name,eventList,eventListMutex):

threading.Thread.__init__(self)

self.name=name

self.eventList=eventList

self.eventListMutex=eventListMutex

self.running=True

self.runningMutex=threading.Lock()defstop(self):

self.runningMutex.acquire()

self.running=False

self.runningMutex.release()defcalculate_deltams(self):

ncpu=self.get_numbers_of_cpu()iflen(cpu_stat)==0:raiseException("Please run check_cpu() at first!")

deltams=1000.0*((cpu_stat['user']+cpu_stat['system']+cpu_stat['idle']+cpu_stat['iowait'])-(prev_cpu_info['user']+prev_cpu_info['system']+prev_cpu_info['idle']+prev_cpu_info['iowait']))/ncpu/HZreturndeltamsdefget_numbers_of_cpu(self):try:

cpufp=file("/proc/cpuinfo")

ncpu=0whileTrue:

line=cpufp.readline()iflen(line)<1:breakifre.search(r"processor\t:",line)!=None:

ncpu+=1finally:

cpufp.close()returnncpudefget_cpu_stat(self):

cpu_info={"user": 0,"system": 0,"idle": 0,"iowait": 0

}try:

cpustatfp=file("/proc/stat")

line=split(cpustatfp.readline())

cpu_info['user']=float(line[1])+float(line[2])

cpu_info['system']=float(line[3])+float(line[6])+float(line[7])

cpu_info['idle']=float(line[4])

cpu_info['iowait']=float(line[5])finally:

cpustatfp.close()returncpu_infodefcheck_cpu(self):globalprev_cpu_info,cpu_stat

cpu={"user": 0,"system": 0,"idle": 0,"iowait": 0

}ifprev_cpu_info['system']==0:

prev_cpu_info=self.get_cpu_stat()

time.sleep(1)else:

prev_cpu_info=cpu_stat

cpu_stat=self.get_cpu_stat()

cpu['user']=cpu_stat['user']-prev_cpu_info['user']

cpu['system']=cpu_stat['system']-prev_cpu_info['system']

cpu['idle']=cpu_stat['idle']-prev_cpu_info['idle']

cpu['iowait']=cpu_stat['iowait']-prev_cpu_info['iowait']

total=(cpu['user']+cpu['system']+cpu['idle']+cpu['iowait'] )

cpu['user']=cpu['user']/total*100cpu['system']=cpu['system']/total*100cpu['idle']=cpu['idle']/total*100cpu['iowait']=cpu['iowait']/total*100returncpudefget_disk_stat(self):

diskfp=open('/proc/diskstats')

all_partition=[]

curr={"major":0,"minor":0,"name": None,#disk name"rd_ios": 0,#read I/O operation"rd_merges": 0,#readed merged"rd_sectors": 0,#sectors readed"rd_ticks": 0,#time in queue and server for read"wr_ios": 0,#write I/O operation"wr_merges": 0,#write merged"wr_sectors": 0,#sectors writed"wr_ticks": 0,#time in queue and server for write"ticks": 0,#time of request in queue"aveq": 0#average queue length}whileTrue:

line=split(diskfp.readline())iflen(line)==0:breakifint(line[3])==0:continuecurr['major']=line[0]

curr['minor']=line[1]

curr['name']=line[2]

curr['rd_ios']=float(line[3])

curr['rd_merges']=float(line[4])

curr['rd_sectors']=float(line[5])

curr['rd_ticks']=float(line[6])

curr['wr_ios']=float(line[7])

curr['wr_merges']=float(line[8])

curr['wr_sectors']=float(line[9])

curr['wr_ticks']=float(line[10])

curr['ticks']=float(line[11])

curr['aveq']=float(line[12])

all_partition.append(curr.copy())returnall_partitiondefcheck_disk(self):globalprev_partition_info

DISK_STAT=[]

deltams=self.calculate_deltams()

curr_partition_info=self.get_disk_stat()iflen(prev_partition_info)==0:

prev_partition_info=curr_partition_info

curr_partition_info=self.get_disk_stat()

partition_num=len(curr_partition_info)

i=0whilei

disk_info=curr_partition_info[i]

prev_disk_info=prev_partition_info[i]

rd_ios=disk_info['rd_ios']-prev_disk_info['rd_ios']

rd_merges=disk_info['rd_merges']-prev_disk_info['rd_merges']

rd_sectors=disk_info['rd_sectors']-prev_disk_info['rd_sectors']

rd_ticks=disk_info['rd_ticks']-prev_disk_info['rd_ticks']

wr_ios=disk_info['wr_ios']-prev_disk_info['wr_ios']

wr_merges=disk_info['wr_merges']-prev_disk_info['wr_merges']

wr_sectors=disk_info['wr_sectors']-prev_disk_info['wr_sectors']

wr_ticks=disk_info['wr_ticks']-prev_disk_info['wr_ticks']

ticks=disk_info['ticks']-prev_disk_info['ticks']

aveq=disk_info['aveq']-prev_disk_info['aveq']#prev_disk_info = disk_info #store the old infoprev_partition_info[i]=curr_partition_info[i]

i=i+1n_ios=rd_ios+wr_ios

n_ticks=rd_ticks+wr_ticks

n_kbytes=(rd_sectors+wr_sectors)/2.0queue=aveq/deltamsifn_ios:

size=n_kbytes/n_ios

wait=n_ticks/n_ioselse:

size=0.0wait=0.0busy=100.0*ticks/deltamsifbusy>100.0:

busy=100#print rd_sectors,wr_sectorsreadPerSec=str(1000*rd_sectors/deltams/2.0*1024)

writePerSec=str(1000.0*wr_sectors/deltams/2.0*1024)

readPerSec=readPerSec[:readPerSec.find(".")+3]

writePerSec=writePerSec[:writePerSec.find(".")+3]#calculate total size and free size for every partitiontry:

mounts=open("/etc/mtab")#initializetotal_size=0

free_size=0whileTrue:

line=mounts.readline().strip()iflen(line)<1:breakifline.find(disk_info['name']+"")!=-1:

line=line.split()

s=os.statvfs(line[1])

total_size=s.f_bsize*s.f_blocks#unit : bytesfree_size=s.f_bsize*s.f_bavail#breakfinally:

mounts.close()

DISK_STAT.append({"name":disk_info["name"],"total_size":total_size,"free_size":free_size,"readPerSec":readPerSec,"writePerSec":writePerSec,"wait":wait,"queue":queue,"size":size})returnDISK_STATdefget_net_stat(self,eth):try:

netfp=file("/proc/net/dev")whileTrue:

line=netfp.readline()ifre.search(eth,line)!=None:

line=split(line[7:])

netin=int(line[0])

netout=int(line[8])breakfinally:

netfp.close()returnnetin,netoutdefcheckNet(self):globalprev_net_info

NET_STATS=[]

net_stat=self.get_net_stat('wlan0')#Caution!!! This should be the Ethernet card in use!!!ifprev_net_info['in']==0andprev_net_info['out']==0:

prev_net_info['in']=net_stat[0]

prev_net_info['out']=net_stat[1]

NET_STATS.append((net_stat[0]-prev_net_info['in'])/SLEEP_TIME )

NET_STATS.append((net_stat[1]-prev_net_info['out'])/SLEEP_TIME )

prev_net_info['in']=net_stat[0]

prev_net_info['out']=net_stat[1]returnNET_STATSdefcheckMem(self):#the memory status fileMEM_FILE="/proc/meminfo"#default statusMEM_STATUS={"MemTotal":0,"MemFree":0,"Cached":0,"SwapCached":0,"Active":0,"Inactive":0,"Inact_dirty":0,"Inact_clean":0,"HighTotal":0,"LowTotal":0,"SwapTotal":0,"SwapFree":0

}try:

fd=file(MEM_FILE,"r")

mem_info_list=fd.readlines()

PATTERN=re.compile(r"^(\w+):\s*(\d+)\s*(\w+)")#e.g:MemTotal: 2061480 kBforlineinmem_info_list:#DEBUGres=PATTERN.match(line)ifres:

var_list=res.groups()ifMEM_STATUS.has_key(var_list[0]):

MEM_STATUS[var_list[0]]=var_list[1]

fd.seek(0)finally:

fd.close()returnMEM_STATUSdefrun(self):whileTrue:

self.runningMutex.acquire()ifnotself.running:

self.runningMutex.release()breakself.runningMutex.release()

cpuStatus=self.check_cpu()

diskStatus=self.check_disk()

netStatus=self.checkNet()

memStatus=self.checkMem()#add those status to eventList#print cpuStatus#print memStatus#print diskStatus#print netStatusself.eventListMutex.acquire()whilelen(self.eventList)>0:delself.eventList[0]

self.eventList.append({"cpu":cpuStatus,"mem":memStatus,"disk":diskStatus,"net":netStatus})#Changed!!! trasform the dictionary to string!!!self.eventListMutex.release()#Just for testtime.sleep(SLEEP_TIME)if__name__=='__main__':

monitor=SysMonitor('SysMonitor',[],threading.Lock())

monitor.start()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值