我知道流程是以层次结构的形式组织的。因此,如果我想实现一个操作,通过追溯到父进程一直回到子树的根来确定给定进程是否属于层次结构中的给定子树,这将是一个成本很高?
答案1
听起来您有两个 PID,并且您想知道其中一个是否是另一个的后代。如果是这样,你可以使用这个:
#!/bin/bash
# Checks the process tree checking to see if PID $1 is an ancestor of
# PID $2. Returns true/false (0/1).
# (Needs error handling to determine if $1 and $2 are provided and both
# are numeric. Left as an exercise for the reader.)
ps -ea -o pid,ppid |
awk '{ parent[$1] = $2 }
END { if (parent[start] == "")
exit 1
while (lookfor != parent[start] && start != 1)
start = parent[start]
exit start==1 ? 1 : 0
}' lookfor="$1" start="$2"
原帖:
这取决于您的最终目标是什么。例如,如果您试图确定两个进程是否从同一个终端会话启动,那么您可以使用选项-o
并ps
告诉它打印会话组 ID(登录 shell 总是启动一个新会话,并且所有后代都会获得该会话 ID)。
如果您有其他目的,或者您的情况必须考虑非登录过程,那么解析 的输出ps
可能是最好的方法。我会在 中给出一个例子awk
,但我不确定您在寻找什么,所以不知道什么输出最适合您的需求。