Saída pstree legível por máquina?

0

Existe uma boa maneira de obter a saída de pstree em alguma saída de máquina legível por máquina sem um monte de código ou uma análise horrível?

Eu realmente quero uma lista de todos os processos descendentes.

Editar: usecase específico: obtenha todos os descendentes

> useful_pstree $PID

1010
1012
10101
1013

um usecase mais geral pode me dar um belo JSON

# json_pstree $PID

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

Embora ... eu realmente não conheço uma maneira agradável de fazer facilmente a recursão de estruturas json a partir da linha de comando (à la jq )

    
por Att Righ 13.10.2017 / 17:28

2 respostas

1

Aqui está um script de shell que imprime a saída de ps iniciando no processo fornecido como argumento e recursivo nos processos filhos. O script está com falta de verificação de erros, e você pode querer adicionar algumas opções para ps dependendo da saída desejada.

#!/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
    
por 13.10.2017 / 18:49
1

Se você tiver uma versão de pgrep que suporte a filtragem por PID pai, poderá usá-la para obter essa lista. Por exemplo:

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

E com matrizes de bash e pgrep , uma passagem pela primeira vez desta árvore:

$ 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
...

Dependendo do que você está usando, você também pode usar ps ou procurar em /proc .

Eu tenho uma versão razoavelmente atual de pstree (GNU, 23.1) e ela não tem opção para imprimir uma saída legível por máquina.

    
por 13.10.2017 / 18:11

Tags