#!/bin/python#-*- coding:utf-8 -*-#Filename: ind_high_io_process#Revision: 1.0#Date: 2013-3-8#Author: simonzhang#web: www.simonzhang.net#Email: simon-zzm@163.com### END INIT INFO
importosimportreimportsysimporttimefrom string importstrip
sys_proc_path= '/proc/'re_find_process_number= '^\d+$'
#Get IO information from /proc/$pid/io
defcollect_info():
_tmp={}
re_find_process_dir=re.compile(re_find_process_number)for i inos.listdir(sys_proc_path):ifre_find_process_dir.search(i):#get process name from /proc/${pid}/stat
process_name = open("%s%s/stat" % (sys_proc_path, i), "rb").read().split(" ")[1]#get io information from /proc/${pid}/io
rw_io = open("%s%s/io" % (sys_proc_path, i), "rb").readlines()for _info inrw_io:
cut_info= strip(_info).split(':')if strip(cut_info[0]) == "read_bytes":
read_io= int(strip(cut_info[1]))if strip(cut_info[0]) == "write_bytes":
write_io= int(strip(cut_info[1]))
_tmp[i]= {"name":process_name, "read_bytes":read_io, "write_bytes":write_io}return_tmpdefmain(_sleep_time, _list_num):
_sort_read_dict={}
_sort_write_dict={}#Get system io information
process_info_list_frist =collect_info()
time.sleep(_sleep_time)
process_info_list_second=collect_info()for loop inprocess_info_list_second.keys():
second_read_v= process_info_list_second[loop]["read_bytes"]
second_write_v= process_info_list_second[loop]["write_bytes"]try:
frist_read_v= process_info_list_frist[loop]["read_bytes"]except:
frist_read_v=0try:
frist_write_v= process_info_list_frist[loop]["write_bytes"]except:
frist_write_v=0#compute
_sort_read_dict[loop] = second_read_v -frist_read_v
_sort_write_dict[loop]= second_write_v -frist_write_v#sort
sort_read_dict = sorted(_sort_read_dict.items(),key=lambda _sort_read_dict:_sort_read_dict[1],reverse=True)
sort_write_dict= sorted(_sort_write_dict.items(),key=lambda _sort_write_dict:_sort_write_dict[1],reverse=True)#print result
print "pid process read(bytes) pid process write(btyes)"
for _num inrange(_list_num):
read_pid=sort_read_dict[_num][0]
write_pid=sort_write_dict[_num][0]
res= "%s" %read_pid
res+= " " * (8 - len(read_pid)) + process_info_list_second[read_pid]["name"]
res+= " " * (12 - len(process_info_list_second[read_pid]["name"])) + "%s" % sort_read_dict[_num][1]
res+= " " * (12 - len("%s" % sort_read_dict[_num][1])) +write_pid
res+= " " * (8 - len(write_pid)) + process_info_list_second[write_pid]["name"]
res+= " " * (12 - len("%s" % process_info_list_second[write_pid]["name"])) + "%s" % sort_write_dict[_num][1]printresprint "\n" * 1
if __name__ == '__main__':try:
_sleep_time= sys.argv[1]except:
_sleep_time= 3
try:
_num= sys.argv[2]except:
_num= 3
try:
loop= sys.argv[3]except:
loop= 1
for i inrange(int(loop)):
main(int(_sleep_time), int(_num))