调取linux系统进程最便捷的方法就是使用psitul库,但是在生产或测试环境中为了提高性能,许多第三方库不能安装,那么该怎么展示呢?
我写了一个脚本,在linux终端直接输入命令,比如:python get.py -tree -c -a就可以检查系统进程树了。
代码附上:
import sys
import time
import copy
import os
import pwd
black_list = ['mysql','python','java']#display highlight
white_list = ['gunicorn', 'kblockd','kintegrityd', 'events', 'migration', 'ksoftirqd',\
'ata_sff','md/','md_misc','aio/','crypto/','kthrotld/','scsi_eh','watchdog', 'mingetty', 'kblockd','bash','sshd']#dont display
# -s:simple -c:complicate -a:all -b:blacklist
def get_name(pid):
try:
with open('/proc/{0}/status'.format(pid), 'r') as f:
for line in f:
if line[:4] == 'Name':
name = line[6:-1]
return name
except:
return 'NaN'
def get_cmd(pid):
try:
path = '/proc/{0}/cmdline'.format(pid)
with open(path, "r") as f:
data = f.read()
cmd_list = [data]
return cmd_list
except:
return ' '
def get_create_time(pid):
try:
path = '/proc/{0}/stat'.format(pid)
start_timestamp = []
with open(path, "r") as f:
for line in f.readlines():
data = line.split('\n\t')
for str in data:
sub_str = str.split(' ')
if sub_str:
start_timestamp.append(sub_str)
running_time = start_timestamp[0][21]
a = int(time.time()) - int(running_time)
return a
except:
return 0
def get_fpid(pid):
try:
with open('/proc/{0}/status'.format(pid), 'r') as f:
for line in f:
if line[:4] == 'PPid':
fpid = line[6:-1]
return fpid
except:
return ' '
def get_fpid_name(pid):
try:
with open('/proc/{0}/status'.format(pid), 'r') as f:
for line in f:
if line[:4] == 'PPid':
fpid = line[6:-1]
fpid_name = get_name(fpid)
return fpid_name
except:
return 'NaN'
def get_memory(pid):
try:
with open('/proc/{0}/status'.format(pid), 'r') as f:
for line in f:
if line[:5] == 'VmRSS':
vmrss = line[7:-1]
return vmrss
except:
return 0
def get_username(pid):
try:
# the /proc/PID is owned by process creator
proc_stat_file = os.stat("/proc/%d" % pid)
# get UID via stat call
uid = proc_stat_file.st_uid
# look up the username from uid
username = pwd.getpwuid(uid)[0]
return username
except:
return ' '
def is_number(s):
try:
float(s)
return True
except ValueError:
pass
try:
import unicodedata
unicodedata.numeric(s)
return True
except (TypeError, ValueError):
pass
return False
def processInfo():
def readname():
filePath = '/proc'
name = os.listdir(filePath)
return name
namelist = readname()
pid_list = []
for i in namelist:
if is_number(i):
pid_list.append(i)
output = {}
a = 0
for pid in pid_list:
output[a] = {
'pid': pid,
'name': get_name(pid),
'fpid': get_fpid(pid),
'fpid_name': get_fpid_name(int(pid)),
'username': get_username(int(pid)),
'create_date': get_create_time(pid),
'cmd': get_cmd(pid),
'internal_memory_rss(kb)': get_memory(pid)
}
a = a + 1
return output
def get_process_info_complicate():
info = processInfo()
process_info = []
for i in range(len(info)):
process_info.append([])
for j in range(8):
process_info[i].append(0)
for key in info:
try:
create_date = time.localtime(info[key]['create_date'])
info[key]['create_date'] = time.strftime("%Y-%m-%d %H:%M:%S", create_date)
except:
info[key]['create_date'] = 0
head = {0: 'pid', 1: 'fpid', 2: 'internal_memory_rss(kb)', 3: 'create_date',
4: 'username', 5: 'name', 6: 'fpid_name', 7: 'cmd'}
for i in info:
for j in range(8):
process_info[i][j] = info[i][head[j]]
process_info_deleted = copy.deepcopy(process_info)
index = []
for i in process_info_deleted[:]:
for j in white_list:
if j in i[5] or j in i[6]:
index1 = process_info_deleted.index(i)
index.append(index1)
index = list(set(index))
index.sort(reverse=True)
for i in index:
process_info_deleted.pop(i)
black_list_process = []
for i in range(len(process_info)):
for j in black_list:
if j in process_info[i][5] or j in process_info[i][6]:
pid = process_info[i]
black_list_process.append(pid)
return black_list_process, process_info_deleted, process_info
def get_process_info_simple():
''' {0:'pid',1:'create_date',2:'name', 3:'cmd'}'''
blacklist_process1, process_info_deleted1, process_info = get_process_info_complicate()
a = []
blacklist_process = []
for i in blacklist_process1:
a.append(i[0])
a.append(i[3])
a.append(i[5])
a.append(i[7])
blacklist_process.append(a)
a = []
process_info_deleted = []
for i in process_info_deleted1:
a.append(i[0])
a.append(i[3])
a.append(i[5])
a.append(i[7])
process_info_deleted.append(a)
a = []
return process_info_deleted, blacklist_process, process_info
def printTree(parent, tree, indent=''):
print parent
if parent not in tree:
return
for child in tree[parent][:-1]:
sys.stdout.write(indent + '|-')
printTree(child, tree, indent + '| ')
child = tree[parent][-1]
sys.stdout.write(indent + '`-')
printTree(child, tree, indent + ' ')
def draw_tree_s_ab(ab):
blacklist_process, process_info_deleted, process_info = get_process_info_complicate()
blacklist_fpid = []
for i in black_list:
for j in process_info:
if i in j[6]:
blacklist_fpid.append(j[1])
blacklist_fpid = set(blacklist_fpid)
str1 = ','
for i in process_info_deleted:
i[5] = i[5] + '(' + str(i[0]) + ') ' + '( cmd:' + str1.join(i[7]) + ') ' + '(create_date' + str(i[3]) + ')'
i[6] = i[6] + '(' + str(i[1]) + ')'
for i in process_info:
i[5] = i[5] + '(' + str(i[0]) + ') ' + '( cmd:' + str1.join(i[7]) + ') ' + '(create_date' + str(i[3]) + ')'
i[6] = i[6] + '(' + str(i[1]) + ')'
process_dic_deleted = {}
fpid = [i[1] for i in process_info_deleted]
fpid = list(set(fpid))
for i in fpid:
process_dic_deleted[i] = []
for i in process_info_deleted:
for key in process_dic_deleted:
if i[1] == key:
process_dic_deleted[key].append(i[5])
process_dic = {}
fpid = [i[1] for i in process_info]
fpid = list(set(fpid))
for i in fpid:
process_dic[i] = []
for i in process_info:
for key in process_dic:
if i[1] == key:
process_dic[key].append(i[5])
# process_dic:{fpid:[pid_name,pid_name], fpid:.....}
black_list_key = []
for i in blacklist_fpid:
for key in process_dic:
if i == key:
for j in process_info:
if i == j[0]:
black_list_key.append(j[5])
for key in process_dic:
for i in process_info:
if key == i[0]:
process_dic[i[5]] = process_dic[key]
del process_dic[key]
for key in process_dic_deleted:
for i in process_info:
if key == i[0]:
process_dic_deleted[i[5]] = process_dic_deleted[key]
del process_dic_deleted[key]
undisplay_list = []
if ab == 'a':
for i in process_dic_deleted:
for key in process_dic_deleted:
if i in process_dic_deleted[key]:
undisplay_list.append(i)
for i in process_dic_deleted:
if i in undisplay_list:
continue
else:
printTree(i, process_dic_deleted)
print('\n')
elif ab == 'b':
'''
for i in black_list_key:
printTree(i, process_dic)
print('\n')
'''
for i in black_list_key:
for key in process_dic:
if i in process_dic[key] and key in black_list_key:
undisplay_list.append(i)
for i in black_list_key:
if i in undisplay_list:
continue
else:
printTree(i, process_dic_deleted)
print('\n')
# draw_tree_s_ab('a')
# draw_tree_s_ab('b')
def draw_tree_c_ab(ab):
'''
{0:'pid', 1:'fpid', 2:'internal_memory_rss(bytes)', 3:'create_date',
4:'username',5:'name', 6:'fpid_name', 7:'cmd'}'''
blacklist_process, process_info_deleted, process_info = get_process_info_complicate()
blacklist_fpid = []
for i in black_list:
for j in process_info:
if i in j[6]:
blacklist_fpid.append(j[1])
blacklist_fpid = set(blacklist_fpid)
str1 = ','
for i in process_info:
i[5] = i[5] + '(' + str(i[0]) + ') ' + '( cmd:' + str1.join(i[7]) + ') ' + '(create_date:' + str(i[3]) + ') ' \
+ '(internal_memory_rss:' + str(i[2]) + ') ' + '(fpid:' + str(i[1]) + ') ' + '(usrname:' + str(
i[4]) + ') ' \
+ '(fpid_name:' + str(i[6]) + ') '
i[6] = i[6] + '(' + str(i[1]) + ')'
for i in process_info_deleted:
i[5] = i[5] + '(' + str(i[0]) + ') ' + '( cmd:' + str1.join(i[7]) + ') ' + '(create_date:' + str(i[3]) + ') ' \
+ '(internal_memory_rss:' + str(i[2]) + ') ' + '(fpid:' + str(i[1]) + ') ' + '(usrname:' + str(
i[4]) + ') ' \
+ '(fpid_name:' + str(i[6]) + ') '
i[6] = i[6] + '(' + str(i[1]) + ')'
process_dic_deleted = {}
fpid = [i[1] for i in process_info_deleted]
fpid = set(fpid)
for i in fpid:
process_dic_deleted[i] = []
for i in process_info_deleted:
for key in process_dic_deleted:
if i[1] == key:
process_dic_deleted[key].append(i[5])
process_dic = {}
fpid = [i[1] for i in process_info]
fpid = set(fpid)
for i in fpid:
process_dic[i] = []
for i in process_info:
for key in process_dic:
if i[1] == key:
process_dic[key].append(i[5])
black_list_key = []
for i in blacklist_fpid:
for key in process_dic:
if i == key:
for j in process_info:
if i == j[0]:
black_list_key.append(j[5])
for key in process_dic:
for i in process_info:
if key == i[0]:
process_dic[i[5]] = process_dic[key]
del process_dic[key]
for key in process_dic_deleted:
for i in process_info:
if key == i[0]:
process_dic_deleted[i[5]] = process_dic_deleted[key]
del process_dic_deleted[key]
undisplay_list = []
if ab == 'a':
for i in process_dic_deleted:
for key in process_dic_deleted:
if i in process_dic_deleted[key]:
undisplay_list.append(i)
for i in process_dic_deleted:
if i in undisplay_list:
continue
else:
printTree(i, process_dic_deleted)
print('\n')
elif ab == 'b':
'''
for i in black_list_key:
printTree(i, process_dic)
print('\n')
'''
for i in black_list_key:
for key in process_dic:
if i in process_dic[key] and key in black_list_key:
undisplay_list.append(i)
for i in black_list_key:
if i in undisplay_list:
continue
else:
printTree(i, process_dic_deleted)
print('\n')
# draw_tree_c_ab('a')
# draw_tree_c_ab('b')
print('input a commend:\n\
tree/info : display a tree / return a list\n\
-s/-c : only display name and cmd / all infomation\n\
-b/-a : only display process in blacklist / display all\n\
please input like:-tree -s -b /-info -c -a')
def excute_commend(commend):
if commend == '-tree -s -a':
print('This is key information for all process:')
draw_tree_s_ab('a')
return 0
elif commend == '-tree -c -a':
print('This is all information for all process:')
draw_tree_c_ab('a')
return 0
elif commend == '-tree -s -b':
print('This is key information for blacklist process:')
draw_tree_s_ab('b')
return 0
elif commend == '-tree -c -b':
print('This is all information for blacklist process:')
draw_tree_c_ab('b')
return 0
elif commend == '-info -s -a':
a, b, c = get_process_info_simple()
print('This is key information for all process:')
print(a)
return a
elif commend == '-info -c -a':
a, b, c = get_process_info_complicate()
print('This is all information for all process:')
print(b)
return b
elif commend == '-info -s -b':
a, b, c = get_process_info_simple()
print('This is key information for blacklist process:')
print(b)
return b
elif commend == '-info -c -b':
a, b, c = get_process_info_complicate()
print('This is all information for blacklist process:')
print(a)
return a
else:
print('error:cant find the commend!')
commend = str(sys.argv[1]) + ' ' + str(sys.argv[2]) + ' ' + str(sys.argv[3])
#commend = '-tree -c -a'
excute_commend(commend)
本次经历总结,自己并不擅长用while循环,经常用几个for循环嵌套,这样写出的代码并不好看,将来要全面的学习,不能让基础语法成为自己成长的阻碍。