Comment puis-je obtenir la totalité de l'arborescence de processus générée par un processus donné affichée sous forme d'arbre et uniquement cet arbre, c'est-à-dire sans aucun autre processus?
La sortie pourrait par exemple ressembler à
4378 ? Ss 0:10 SCREEN
4897 pts/16 Ss 0:00 \_ -/bin/bash
25667 pts/16 S+ 0:00 | \_ git diff
25669 pts/16 S+ 0:00 | \_ less -FRSX
11118 pts/32 Ss+ 0:00 \_ -/bin/bash
11123 pts/32 S+ 0:00 \_ vi
Je ne pouvais pas obtenir le résultat souhaité uniquement avec des paramètres ps
.
Ce qui suit donne le résultat souhaité mais semble un peu impliqué:
#!/bin/bash
pidtree() {
echo -n $1 " "
for _child in $(ps -o pid --no-headers --ppid $1); do
echo -n $_child `pidtree $_child` " "
done
}
ps f `pidtree 4378`
Quelqu'un at-il une solution plus facile?
ps auxf
.Réponses:
C'est
pstree
une très bonne solution, mais c'est un peu réticent. Je l'utiliseps --forest
plutôt. Mais pas pour aPID
(-p
) car il affiche uniquement le processus spécifique, mais pour la session (-g
). Il peut imprimer n'importe quelle informationps
peut être imprimé dans une arborescence de fantaisie ASCII définissant l'-o
option.Donc ma suggestion pour ce problème:
Si le processus n'est pas un chef de session, un truc un peu plus doit être appliqué:
Cela récupère d'abord l'identifiant de session (SID) du processus en cours, puis appelle à nouveau ps avec ce sid.
Si les en-têtes de colonne ne sont pas nécessaires, ajoutez un '=' après chaque définition de colonne dans les options '-o', comme suit:
Un exemple d'exécution et le résultat:
Malheureusement, cela ne fonctionne pas
screen
car il définit le sid pour chaque écran enfant et tous les bash enfants.Pour obtenir tous les processus engendrés par un processus, il faut construire l'arbre entier. J'ai utilisé awk pour ça. Au début, il construit un tableau de hachage pour tout contenir
PID => ,child,child...
. À la fin, il appelle une fonction récursive pour extraire tous les processus enfants d'un processus donné. Le résultat est passé à un autreps
pour formater le résultat. Le PID réel doit être écrit comme argument pour awk au lieu de<PID>
:Pour un processus SCREEN (pid = 8041), l'exemple de sortie ressemble à ceci:
la source
ps
aviez une option d'indicateur de filtre pour filtrer tous les descendants d'un PID.où
${pid}
est le pid du processus parent.Sous Gentoo Linux,
pstree
le paquet "psmisc" se trouve apparemment àhttp://psmisc.sourceforge.net/la source
pstree
, mais raté un format de sortie plus prolixe. Cependant,pstree -p <pid>
imprimez au moins les pids qui sont raisonnablement proches.sed
tout ça .. mmm ça marche :)pstree -pn 4008 |grep -o "([[:digit:]]*)" |grep -o "[[:digit:]]*"
Voici ma version qui tourne instantanément (car
ps
exécutée une seule fois). Fonctionne en bash et zsh.la source
echo $1
la première boucle for en le changeant enecho $i
.J'ai créé un petit script bash pour créer une liste de pid des processus enfants d'un parent. Récursivement jusqu'à ce qu'il trouve le dernier processus enfant qui n'a aucun enfant. Cela ne vous donne pas une vue en arbre. Il ne liste que tous les pid.
le premier argument de list_offspring est le pid parent
la source
ps -H -g "$pid" -o comm
n’ajoute pas d’arbre en soi, c’est juste la liste des processus.
donne par exemple
la source
-H
option est utilisée pour afficher un arbre de processus ou "hiérarchie de processus (forêt)"Je travaille pour trouver une solution au même problème. Fondamentalement, ps manpage ne documente aucune option permettant de faire ce que nous voulons avec une seule commande. Conclusion: un script est nécessaire.
Je suis venu avec un script très similaire au vôtre. Je l'ai collé dans mon ~ / .bashrc pour que je puisse l'utiliser depuis n'importe quel shell.
la source
En route sur la ligne de commande:
il produit:
manière plus élégante de cette manière est de définir une fonction dans
.bashrc
:puis sur la ligne de commande exécutée:
la source
Cela ne donne que les pid + enfants pids chacun sur une ligne, ce qui est utile pour un traitement ultérieur.
la source
J'ai fait un scénario similaire basé sur celui de Philippe
Tous les pid enfants, petits-enfants, etc. sont générés dans un format délimité par des espaces. Cela peut, à son tour, être transmis à ps, comme dans
la source
pour tout processus - pstree -a show by user - utilisateur pstree
la source