command pstree PID
可以显示PID
指定的进程的所有子进程信息。但是,我还想知道流程PID
的所有父流程信息,我该如何获取它?
一个例子,给出以下过程:
init |- parent_process | `- current_process | |- subprocess_1 | `- subprocess_2 `- other_process
我想要的是当我运行pstree current_process_pid
时,我希望得到低于输出
init `- parent_process `- current_process |- subprocess_1 `- subprocess_2
当我运行pstree subprocess_1_pid
时,它会输出
init `- parent_process `- current_process `- subprocess_1
提前致谢
答案 0 :(得分:13)
# With my psmisc 22.20:
pstree -p -s PID
也许如果使用ps -ef:
awk -vPID=$1 '
function getParent ( pid ) {
if (pid == "" || pid == "0") return;
while ("ps -ef | grep "pid | getline) {
if ($2 == pid) {
print $8"("$2") Called By "$3;
getParent($3);
break;
}
}
close ("ps -ef")
}
BEGIN { getParent(PID) }
'
假设ps输出列和顺序,这很难看。实际上,一次运行的ps -ef包含了所需的所有信息。 这不值得的时候,我仍然建议更新psmisc,它不会受到伤害。
编辑:使用单次运行ps -ef的模仿:
ps -ef | awk -vPID=$1 '
function getpp ( pid, pcmd, proc ) {
for ( p in pcmd ) {
if (p == pid) {
getpp(proc[p], pcmd, proc);
if (pid != PID) printf("%s(%s)───", pcmd[pid], pid);
}
}
}
NR > 1 {
# pid=>cmd
pcmd[$2] = $8;
# pid=>Parent
pproc[$2] = $3;
}
END {
getpp(PID, pcmd, pproc);
printf "\n";
system("pstree -p "PID);
}'
答案 1 :(得分:2)
我发现@haridsv(laps
)提到的pstree -laps <pid>
个选项是一个解决方案。虽然这对我来说有点冗长,所以我坚持使用较短的aps
输出。