Visualize ancestrais do processo do usuário atual e formate a saída

3

Estou usando ps -eo ppid,pid,cmd para visualizar todo o processo e como posso formatar a saída para visualizar como abaixo?

Somente o PID e seu ancestral serão impressos (até o init).

23464   current
  |
23211   bash
  |
23210   sshd: xxW
  |
23193   sshd: WWcccv
  |
 728    /usr/sbin/sshd –D
  |
  1     init

Estou escrevendo um script para visualizar o processo ancestral usando o PID sem usar pstree , se possível.

    
por Asif 19.12.2015 / 10:17

3 respostas

3

Talvez algo como:

#! /bin/bash -
pid=${1?Please give a pid}
sep=
while
  [ "$pid" -gt 0 ] &&
    read -r ppid name < <(ps -o ppid= -o args= -p "$pid")
do
  printf "$sep%$((3+${#pid}/2))d%$((4-${#pid}/2))s%s\n" "$pid" "" "$name"
  sep=$'  |\n'
  pid=$ppid
done

O que dá:

$ that-script "$$"
13612  /bin/zsh
  |
 4137  SCREEN screen -xRS main
  |
 4136  screen screen -xRS main
  |
 4130  zsh
  |
 4128  xterm
  |
  1    /sbin/init splash

Isso é um pouco lento, pois executa um ps por processo no ancestral. Você pode melhorar isso executando ps para recuperar todas as informações de uma só vez e pós-las com awk , por exemplo:

#! /bin/sh -
pid=${1?Please give a pid}
ps -Ao pid= -o ppid= -o args= |
  awk -v p="$pid" '
    {
      pid = $1; ppid[pid] = $2
      sub(/([[:space:]]*[[:digit:]]+){2}[[:space:]]*/, "")
      args[pid] = $0
    }
    END {
      while (p) {
        printf "%s%*d%*s%s\n", sep, 3+length(p)/2, p, 4-length(p)/2, "", args[p]
        p = ppid[p]
        sep = "  |\n"
      }
    }'
    
por 28.07.2018 / 13:41
0

Coloque o pid, o ppid está em ordem. Função recursiva ou loops para percorrer o array, imprimindo apenas as entradas pid e ppid desejadas.

    
por 19.12.2015 / 16:29
0

Que tal usar pstree -spa? Ele mostrará os predecessores e ancestrais para o pid dado, incluindo pid e linhas de comando.

$ pstree -spa 3056
systemd,1
  └─upowerd,3056
      ├─{gdbus},3071
      └─{gmain},3069
    
por 20.12.2015 / 12:13