【问题标题】:How to get all parent processes and all subprocesses with `pstree`如何使用`pstree`获取所有父进程和所有子进程
【发布时间】:2012-10-02 20:28:45
【问题描述】:

命令pstree PID可以显示PID指定进程的所有子进程信息。不过我也想知道进程PID的所有父进程信息,请问如何获取呢?

一个例子:

在里面 |- 父进程 | `- current_process | |- 子进程_1 | `- subprocess_2 `- 其他进程

我想要的是当我运行pstree current_process_pid 时,我想得到以下输出:

在里面 `- 父进程 `- current_process |- 子进程_1 `- subprocess_2

当我运行pstree subprocess_1_pid时,它会输出:

在里面 `- 父进程 `- current_process `- subprocess_1

【问题讨论】:

  • 注意:使用 pstree/ps 命令的 -l 选项会显示带有进程命令行参数的长行。当您想要跟踪每个进程的命令行参数并查看触发了哪个命令/脚本(例如,找出为 Web UI 操作运行哪些后端脚本)时很有帮助。

标签: linux shell command-line


【解决方案1】:
# 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);
}'

【讨论】:

  • -s 选项不受我的pstree 支持,由psmisc-22.2-7.el5_6.2 安装
  • 作为助记符,我记得 args 为 lapspstree -laps <pid> 一样,以获取带有附加信息的分支。
  • @MeaCulpa hmm 对我来说 pstree -p -s PID 不起作用,但 pstree -s -p PID 在 mac 上工作...
【解决方案2】:

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

获取当前进程的进程树(Bash中ID为$$):

pstree -aps $$

这样打印进程树:

systemd,1
  └─kitty,86739
      └─bash,86742
          └─pstree,86904 -aps 86742

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-01
    • 1970-01-01
    • 2013-07-05
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    相关资源
    最近更新 更多