首页 > 解决方案 > 如何构建流程树?

问题描述

我有一个进程列表。

我想把这个进程列表组织成一个树形结构,这样我就可以轻松地可视化父子关系,并识别可疑或不需要的进程。

但是,我正在努力想出一种算法或伪代码来创建流程树。

我不能使用像 pstree 这样的工具,因为我正在处理文本进程日志。

你能指出任何可以应用于这个问题的数据结构或算法吗?

下面是一些示例代码来说明问题:

class Process():
    def __init__(self, name, pid, parent_pid):
        self.name = name
        self.pid = pid
        self.ppid = parent_pid

# assume you have a process list with these fields:
# process name, PID, Parent PID
proc1 = Process("one", 1, 0)
proc2 = Process("two", 2, 1)
proc3 = Process("three", 3, 2)
proc4 = Process("four", 4, 3)
proc5 = Process("five", 5, 3)
proc6 = Process("six", 6, 2)

# append each process to a list
process_list = [proc1, proc2, proc3, proc4, proc5, proc6]

for each_proc in process_list:
    # how do I do this?
    get_child_processes()
    display_as_tree()

"""
Desired output:

one
|
|__two
   |
   |__three
   |   |
   |   |_four
   |   |
   |   |_five
   |
   |__six


"""
            

标签: python-3.xprocesstreehierarchy

解决方案


在解决了这个问题之后,我通过深度优先搜索算法找到了解决方案。

这是带有输出的代码的简化示例:

# Make a dictionary consisting of parent processes child nodes
# This is basically an adjacency graph
graph = {
    'proc1' : ['proc2','proc3'],
    'proc2' : ['proc4', 'proc5'],
    'proc3' : ['proc7'],
    'proc4' : [],
    'proc5' : ['proc6'],
    'proc6' : [],
    'proc7' : []
}

# Set to keep track of visited nodes.
visited = set()

# Use the depth first search algorithm to construct the process tree
def depth_first_search(visited, graph, node, padding):
    if node not in visited:
        display = padding + node
        print (display.strip())
        padding += "..."
        visited.add(node)
        for neighbour in graph[node]:
            depth_first_search(visited, graph, neighbour, padding)

# Execute depth first search function
padding = "".strip()
depth_first_search(visited, graph, 'proc1', padding)

输出:

$ python proc_tree.py

proc1
...proc2
......proc4
......proc5
.........proc6
...proc3
......proc7

推荐阅读