编辑:特定用例:获取所有后代

编辑:特定用例:获取所有后代

有没有一种很好的方法来获取pstree某些机器可读的机器输出的输出,而无需一堆代码或可怕的解析?

我真的想要一个所有后代进程的列表。

编辑:特定用例:获取所有后代

> useful_pstree $PID

1010
1012
10101
1013

更通用的用例可能会给我漂亮的 JSON

# json_pstree $PID

 { 'pid': 1010,
       children: { ...

虽然......我真的不知道从命令行轻松执行 json 结构递归的好方法(à la jq

答案1

ps下面是一个 shell 脚本,它打印从作为参数给出的进程开始的输出,并在子进程上递归。该脚本缺乏错误检查,您可能需要ps根据所需的输出添加一些选项。

#!/bin/sh

printps() {
    if [ $# -gt 0 ]
    then
        ps --no-headers $*
        for p in $*; do
            printps $(cat /proc/$p/task/$p/children)
        done
    fi
}

printps $1

答案2

pgrep如果您有支持按父 PID 进行过滤的版本,那么您可以使用它来获取此列表。例如:

$ pstree -pa 1058
terminator,1058 /usr/bin/terminator
  ├─sudo,1249 -i
  │   └─zsh,1252
  ├─zsh,1250
  │   └─wget,26232 --continue --input-file=-
  ├─zsh,28482
...

使用 bash 数组 和pgrep,对这棵树进行广度优先遍历:

$ pids=( 1058 ); for ((i=0; i < ${#pids[@]}; i++)); do pids+=( $(pgrep -P ${pids[$i]}) ); done; printf "%s\n" "${pids[@]}"
1058
1249
1250
28482
1252
26232
29138
...

根据您所使用的内容,您还可以使用ps或查看/proc.

我有一个相当当前的版本pstree(GNU,23.1),它没有打印机器可读输出的选项。

相关内容