如何通过`pstree`获取所有父进程和所有子进程

Con*_*Guo 12 linux shell command-line

命令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

提前致谢

Mea*_*lpa 13

# With my psmisc 22.20:
pstree -p -s PID
Run Code Online (Sandbox Code Playgroud)

也许如果使用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) }
'
Run Code Online (Sandbox Code Playgroud)

假设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);
}'
Run Code Online (Sandbox Code Playgroud)

  • 我的`pstree`不支持`-s`选项,它由`psmisc-22.2-7.el5_6.2安装 (3认同)
  • 作为助记符,我记得args为`laps`,如'pstree -laps <pid>`,以获取带有附加信息的分支. (2认同)

mar*_*iev 6

我发现laps@haridsv ( pstree -laps <pid>)提到的选项是一个解决方案。不过对我来说有点冗长,所以我会坚持使用较短的aps输出。