2011-08-21 24 views
6

Me gustaría crear un alias bash que me proporcione el árbol de procesos desde la sesión bash actual que estoy usando, hasta init.¿Cómo mostrar el árbol de procesos actual de una sesión bash?

El caso de uso es saber si he usado el comando bash o vi:shell.

Estoy usando MacOS X. He oído hablar de pstree, pero parece que solo muestra los niños, no la relación entre init y el proceso actual.

Respuesta

5

Estoy seguro de que con un poco de búsqueda en Google, puede encontrar cómo obtener y descargar pstree para Mac. Sin embargo, puede hacer una versión pobre, usando ps y ppid.

por ejemplo

ps -eo ppid,pid,cmd | awk '{p[$1]=p[$1]","$3}END{ for(i in p) print i, p[i]}' 
+0

Tal vez me equivoque, pero parece que pstree, junto con usted versión del hombre pobre, sólo muestra los niños de un proceso. Tenga en cuenta que no pude usar su versión correctamente, ya que el 'ps' de Mac es bastante pobre y no admite' cmd'. Me gustaría ver la relación entre init y el proceso actual. ¿Alguna conjetura? –

+1

Parece que OS X está usando 'comm' en lugar de' cmd' en el comando 'ps'. –

+0

la versión del pobre simplemente hace que todos los procesos parentales y sus hijos estén juntos. Eso es todo. – ghostdog74

1

Si utiliza un administrador de paquetes como MacPorts, puede instalar pstree fácilmente.

1

no tengo toda la respuesta que estás buscando, pero tengo una idea que pueden moverse en la dirección correcta. El comando

declare -A parent 

va a crear una matriz asociativa (un hash, si habla Perl)

Se necesita algo de comandos que le dará pares de nombre y valor de PID y PPID ... yo creo que es que se puede hacer que el comando ps de mac haga esto si lo torturas lo suficiente. Voy a usar 'ps -eo' como arriba, pero querrás completar los espacios en blanco.

entonces usted puede hacer algo como esto:

ps -eo pid,ppid | while read pid ppid 
do 
    parent[$pid]=$ppid 
    echo "pid: $pid ppid: ${parent[$pid]} grandppid: ${parent[${parent[$pid]}]}" 
done 

que estaba teniendo problemas para hacer los valores de la matriz $ persistir fuera de mi bucle while, de lo contrario habría creado un segundo bucle for para recorrer desde $$ volver a init. Lo dejo como un ejercicio para el lector.

2

Utilicé Mac OS 10.7 Lion, pero creo que será bastante portátil para cartuchos similares a Bourne en otros sistemas tipo Unix. Puede tener problemas con la palabra clave del comando en el argumento de ps.

pongo el siguiente código en un archivo llamado procsup.sh, que define una función de shell para seguir los padres del proceso para procesar ID 1. (a menudo encuentro funciones de shell más fácil de trabajar que el alias.)

procsup() 
{ 
    leaf=$$ 
    ps -eo pid,ppid,command | awk -v leaf="$leaf" \ 
     '{parent[$1]=$2;command[$1]=$3;}                         
    function print_ancestry(pid)                           
    {                                  
     print pid " (" command[pid] ") child of " parent[pid];                    
     if(pid!=1) print_ancestry(parent[pid])                        
    };                                  
    END{\                                 
     print_ancestry(leaf)                            
    }' 
} 

Luego comencé un shell y obtuve procsup.sh. En la vida real, se aseguraría de que sus nuevos shells se originaran automáticamente procsup.sh cuando se iniciaran, tal vez en su .bashrc personal. Primero revisé la ascendencia de ese caparazón. Entonces comencé vi desde ese caparazón. Como de costumbre, la interacción con vi no llegó a la transcripción hasta que lo hice :shell. Mi ventana de terminal se veía así:

Mariel:~/Library/Scripts 1j david$ 
Mariel:~/Library/Scripts 1j david$ 
Mariel:~/Library/Scripts 1j david$ . procsup.sh 
Mariel:~/Library/Scripts 1j david$ procsup 
41926 (-bash) child of 41922 
41922 (login) child of 41917 
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281 
19281 (/sbin/launchd) child of 1 
1 (/sbin/launchd) child of 0 
Mariel:~/Library/Scripts 1j david$ 
Mariel:~/Library/Scripts 1j david$ 
Mariel:~/Library/Scripts 1j david$ vi 

bash-3.2$ # Have just done :shell. 
bash-3.2$ . procsup.sh 
bash-3.2$ procsup 
42325 (/bin/bash) child of 42324 
42324 (vi) child of 41926 
41926 (-bash) child of 41922 
41922 (login) child of 41917 
41917 (/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal) child of 19281 
19281 (/sbin/launchd) child of 1 
1 (/sbin/launchd) child of 0 
bash-3.2$ 
bash-3.2$ 
3

Esto se apoya en pstree(1) mediante el uso de una opción para mostrar el árbol solo por un PID particular y proporcionar el PID del proceso actual ($$ en Bash), la opción se denomina de forma diferente entre Versión licenciada por GPL por Werner Almesberger distribuida con Debian y la versión BSD por Fred Hucht distribuida con MacOS.

  • En Debian/Ubuntu: pstree -s $$

    init───gnome-terminal───bash───pstree 
    

    Resumen de -s opción:

    -s  Show parent processes of the specified process. 
    
  • en MacOS: pstree -p $$

    -+= 00001 root /sbin/launchd 
    \-+= 25706philipbranning/Applications/Utilities/Terminal.app/Contents/MacOS/Terminal 
        \-+= 25716 root login -pfl philipbranning /bin/bash -c exec -la bash /bin/bash 
        \-+= 25722 philipbranning -bash 
         \-+= 32456 philipbranning pstree -p 25722 
         \--- 32457 root ps -axwwo user,pid,ppid,pgid,command 
    

    Resumen de -p opción:

    -p pid show only branches containing process <pid> 
    

Ésta es tu alias para MacOS:

alias psme='pstree -p $$' 
+0

Gracias! ¡Esto es exactamente lo que estaba buscando! Y parece una respuesta mejor y más directa que la aceptada, dado que uno tiene acceso a 'pstree', por supuesto. – Wizek

+0

En OSX tengo 'pstree $ Revision: 2.39 $ por Fred Hucht' y aquí la opción' -s' no funcionó, pero la opción '-p' hizo:' pstree -p $$ '. –

+0

gracias @AlexanderKlimetschek He actualizado la respuesta para mostrar que '-p' es necesario para la versión diferente de pstree distribuida con MacOS – pneumatics

Cuestiones relacionadas