python2 调取linux系统进程信息并以pstree形式展示

该博客介绍了如何在不使用第三方库的情况下,通过Python脚本获取和展示Linux系统的进程信息。作者提供了一个命令行工具,可以展示进程树,并允许过滤黑白名单。脚本包含了获取PID、进程名、父进程信息、创建时间、内存使用等详细信息,并能以简洁或完整模式显示。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

调取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循环嵌套,这样写出的代码并不好看,将来要全面的学习,不能让基础语法成为自己成长的阻碍。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值