创建进程树

创建进程树

我正在实施 pstree 作为一项作业,

我想创造进程的测试树,但我正在努力这样做。

我尝试做类似的事情来创建后台进程树,以便以后可以测试我的脚本。

进程的递归树

childProcess(){

        echo "mine PID is: "$$

        local -i level=$(expr $1 - 1)  # level of recursion

        if [[ $level -gt 0 ]]; then
          echo $level
          childProcess $level &           # we do binary tree
          echo "Process with  PID $! launched"
          childProcess $level &
          echo "Process with  PID $! launched"
          sleep $level
          echo "baf! "$level" pid is: "$$
        fi
}


# create binary tree of depth 4
for (( i = 0; i < 2; i++ )); do
    childProcess 4 &
    echo "running proces no. :"$!
done

但我想从进程内部回显 PID,但我不能这样做。

另一个不起作用的解决方案是这样的,但它以“DFS 方式”创建进程。

declare -i level=$1


if [[ $level -gt 0 ]]; then
  sh $0 $(expr $level - 1)  # spawn children
  sh $0 $(expr $level - 1)  # spawn children

  sleep 100;
  echo "level :"$level" process no: "$$
fi

谁能告诉我如何构建可以通过 PID 访问的进程树,并且该树将一直存在,直到我删除它们,例如通过杀死最旧的进程。

答案1

我建议拍摄系统上当前运行的进程的快照。您需要的绝对最小值是每个 PID 及其相应的 PPID:

ps -ax -o pid=,ppid=

这将为您提供两列数字,可以将其存储在文件中并根据需要手动编辑。这样做的好处是,它可以为您的程序提供来自真实运行系统的输入,并且很容易生成。

然后,您可以编写最小程序来读取这些数字并以树状方式输出它们,例如

awk -v OFS='\t' '
{
        ppid[$1] = $2
}

function print_pid(pid, level) {
        $0 = ""
        $(level+1) = pid
        print

        for (p in ppid)
                if (ppid[p] == pid)
                        print_pid(p, level + 1)
}

END {
        print_pid(1,0)
}'

剩下的工作是将实际的命令名称等添加到输出中(您将不得不要求ps提供更多数据),并用简单的 ASCII 图形来装饰输出。

据我所知,pstree我有权访问的实用程序实际上用于ps生成其输入。

相关内容