![创建进程树](https://linux22.com/image/65191/%E5%88%9B%E5%BB%BA%E8%BF%9B%E7%A8%8B%E6%A0%91.png)
我正在实施 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
生成其输入。