Машиночитаемый выход pstree?

Есть ли хороший способ получить вывод pstree на каком-нибудь машиночитаемом выходе машины без кучи кода или ужасного разбора?

Я просто очень хочу, чтобы список всех процессов потомков.

Изменить: конкретный usecase: получить всех потомков

 > useful_pstree $PID 1010 1012 10101 1013 

более общая информация может дать мне прекрасный JSON

 # json_pstree $PID { 'pid': 1010, children: { ... 

Хотя … Я действительно не знаю, как легко сделать рекурсию json-структур из командной строки (à la jq )

Если у вас есть версия 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), и у нее нет возможности печатать машиносчитываемый вывод.

Вот сценарий оболочки, который печатает вывод ps начиная с процесса, заданного как аргумент, и рекурсирует над дочерними процессами. В скрипте отсутствует проверка ошибок, и вы можете добавить некоторые опции в 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