Come posso mostrare l'albero dei processi di una shell terminale compresi i bambini?


30

Quando uno script viene lanciato dal prompt dei comandi, la shell genererà un sottoprocesso per quello script. Voglio mostrare quella relazione tra il processo a livello terminale e i suoi figli usando psun output in stile albero.
Come posso fare questo?

Quello che ho provato finora

file: script.sh

#!/bin/bash

ps -f -p$1

Quindi invoco lo script dalla riga di comando passando l'id del processo della shell del terminale:

$ ./script.sh $$

Quello che voglio è qualcosa del genere

  • processo di shell di livello superiore (terminale)
  • ./script.sh
  • processo per il pscomando stesso
USER    PID  [..]
ubuntu 123     -bash
ubuntu 1234    \_ bash ./script.sh
ubuntu 12345      \_ ps auxf 

quello che sto ottenendo è:

  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash

2
Perché non usare pstree?
Muru,

@muru Ho provato pstreee non sono riuscito a produrre output significativi, penso che non abbia pstree $$prodotto bash--pstreeesattamente quello che stavo cercando.
the_velour_fog

Come non è quello che stai cercando? Hai sostituito lo script e ps, quindi, cos'altro ti aspetti di vedere tranne pstree?
Muru,

@muru hai ragione tecnicamente quello che volevo, ma troppo minimale. cioè come fai a sapere con certezza quali processi stai guardando senza un PID come ps lo mostra l'output della tabella?
the_velour_fog

4
pstree -p $$? Oppure, se si vuole di più della linea di comando show, pstree -pa $$. Oppure, se si desidera visualizzare tutti i processi principali che salgono, pstree -psa $$.
Muru,

Risposte:


30

Provare

# ps -aef --forest
root     114032   1170  0 Apr05 ?        00:00:00  \_ sshd: root@pts/4
root     114039 114032  0 Apr05 pts/4    00:00:00  |   \_ -bash
root      56225 114039  0 13:47 pts/4    00:00:16  |       \_ top
root     114034   1170  0 Apr05 ?        00:00:00  \_ sshd: root@notty
root     114036 114034  0 Apr05 ?        00:00:00  |   \_ /usr/libexec/openssh/sftp-server
root     103102   1170  0 Apr06 ?        00:00:03  \_ sshd: root@pts/0
root     103155 103102  0 Apr06 pts/0    00:00:00  |   \_ -bash
root     106798 103155  0 Apr06 pts/0    00:00:00  |       \_ su - postgres
postgres 106799 106798  0 Apr06 pts/0    00:00:00  |           \_ -bash
postgres  60959 106799  0 14:39 pts/0    00:00:00  |               \_ ps -aef --forest
postgres  60960 106799  0 14:39 pts/0    00:00:00  |               \_ more

5
La domanda implicava la ricerca di un albero di processo a partire da un processo specifico, prendendo $1argomento da uno script o usando $$per guardare l'albero a partire dalla shell corrente ... Puoi aggiornare la tua risposta per includere informazioni su come ottenere una foresta a partire da un processo specifico?
filbranden,

23

L'ho trovato dopo aver letto questa risposta da superutente , notando questo commento

Ma non per un PID (-p) perché stampa solo il processo specifico, ma per la sessione (-g)

e sperimentando

ps f -g<PID>

risultato

$ ./script.sh $$
  PID TTY      STAT   TIME COMMAND
14492 pts/24   Ss     0:00 -bash
 9906 pts/24   S+     0:00  \_ bash ./script.sh 14492
 9907 pts/24   R+     0:00      \_ ps f -g14492

3
dalla pagina man:OUTPUT MODIFIERS: f ASCII-art process hierarchy (forest)
phyatt,

1

È possibile utilizzare il comando ps f -g <PID>e stat il processo di root per PID:

#> ps f -g 0

PID TTY      STAT   TIME COMMAND
2 ?        S      0:00 [kthreadd]
3 ?        S      0:01  \_ [ksoftirqd/0]
7 ?        S      0:19  \_ [rcu_sched]

1

Prova questo:

 $ ps -afx
  PID TTY      STAT   TIME COMMAND
    2 ?        S      0:00 [kthreadd]
    4 ?        I<     0:00  \_ [kworker/0:0H]
    6 ?        I<     0:00  \_ [mm_percpu_wq]
    7 ?        S      0:14  \_ [ksoftirqd/0]
    8 ?        I      0:34  \_ [rcu_sched]
    9 ?        I      0:00  \_ [rcu_bh]
   10 ?        S      0:00  \_ [migration/0]
   11 ?        S      0:00  \_ [watchdog/0]
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.