有没有一种很好的方法来获取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),它没有打印机器可读输出的选项。