¿El equivalente de Linux '' ps f '(vista de árbol) en OSX?

77

¿Cómo puedo obtener una vista de árbol como la de abajo en OSX?

vartec@some_server:~$ ps xf
PID TTY      STAT   TIME COMMAND
11519 ?        S      0:00 sshd: vartec@pts/0
11520 pts/0    Ss     0:00  \_ -bash
11528 pts/0    R+     0:00      \_ ps xf

Para aclarar, lo que más me interesa es la estructura del árbol, no la información extendida.

    
pregunta vartec 11.04.2011 - 15:49

4 respuestas

95

Puedes instalar el comando pstree usando Homebrew (mi favorito personal), MacPorts o Fink y obtendrás una línea de comandos, vista de árbol de procesos en tu Mac.

Con Homebrew instalado, simplemente ejecuta:

brew install pstree

luego utilízalo como pstree desde la línea de comandos.

    
respondido por el Ian C. 11.04.2011 - 22:55
19

El siguiente script de Perl pequeño que he llamado 'treeps' debería hacer exactamente eso; funciona en linux (Sci Linux 6) + OSX (10.6, 10.9)

Salida de ejemplo:

$ ./treeps
    |_ 1        /sbin/launchd
        |_ 10       /usr/libexec/kextd
        |_ 11       /usr/sbin/DirectoryService
        |_ 12       /usr/sbin/notifyd
        |_ 118      /usr/sbin/coreaudiod
        |_ 123      /sbin/launchd
    [..]
           |_ 157      /Library/Printers/hp/hpio/HP Device [..]
           |_ 172      /Applications/Utilities/Terminal.app [..]
              |_ 174      login -pf acct
                 |_ 175      -tcsh
                    |_ 38571    su - erco
                       |_ 38574    -tcsh

Aquí está el código ...

#!/usr/bin/perl
# treeps -- show ps(1) as process hierarchy -- v1.0 [email protected] 07/08/14
my %p; # Global array of pid info
sub PrintLineage($$) {    # Print proc lineage
  my ($pid, $indent) = @_;
  printf("%s |_ %-8d %s\n", $indent, $pid, $p{$pid}{cmd}); # print
  foreach my $kpid (sort {$a<=>$b} @{ $p{$pid}{kids} } ) {  # loop thru kids
    PrintLineage($kpid, "   $indent");                       # Recurse into kids
  }
}
# MAIN
open(FD, "ps axo ppid,pid,command|");
while ( <FD> ) { # Read lines of output
  my ($ppid,$pid,$cmd) = ( $_ =~ m/(\S+)\s+(\S+)\s(.*)/ );  # parse ps(1) lines
  $p{$pid}{cmd} = $cmd;
  # $p{$pid}{kids} = (); <- this line is not needed and can cause incorrect output
  push(@{ $p{$ppid}{kids} }, $pid); # Add our pid to parent's kid
}
PrintLineage(($ARGV[0]) ? $ARGV[0] : 1, "");     # recurse to print lineage starting with specified PID or PID 1.
    
respondido por el Greg Ercolano 09.07.2014 - 00:56
6

Adapté el script de Perl de Greg Ercolano al script de Python.

#!/usr/bin/env python2.7

import subprocess as subp
import os.path
import sys
import re
from collections import defaultdict

def psaxo():
    cmd = ['ps', 'axo', 'ppid,pid,comm']
    proc = subp.Popen(cmd, stdout=subp.PIPE)
    proc.stdout.readline()
    for line in proc.stdout:
        yield line.rstrip().split(None,2)

def hieraPrint(pidpool, pid, prefix=''):
    if os.path.exists(pidpool[pid]['cmd']):
        pname = os.path.basename(pidpool[pid]['cmd'])
    else:
        pname = pidpool[pid]['cmd']
    ppid = pidpool[pid]['ppid']
    pppid = pidpool[ppid]['ppid']
    try:
        if pidpool[pppid]['children'][-1] == ppid:
            prefix = re.sub(r'^(\s+\|.+)[\|'](\s+\|- )$', '\g<1> \g<2>', prefix)
    except IndexError:
        pass
    try:
        if pidpool[ppid]['children'][-1] == pid:
            prefix = re.sub(r'\|- $', ''- ', prefix)
    except IndexError:
        pass
    sys.stdout.write('{0}{1}({2}){3}'.format(prefix,pname,pid, os.linesep))
    if len(pidpool[pid]['children']):
        prefix = prefix.replace('-', ' ')
        for idx,spid in enumerate(pidpool[pid]['children']):
            hieraPrint(pidpool, spid, prefix+' |- ')

if __name__ == '__main__':
    pidpool = defaultdict(lambda:{"cmd":"", "children":[], 'ppid':None})
    for ppid,pid,command in psaxo():
        ppid = int(ppid)
        pid  = int(pid)
        pidpool[pid]["cmd"] = command
        pidpool[pid]['ppid'] = ppid
        pidpool[ppid]['children'].append(pid)

    hieraPrint(pidpool, 1, '')

Salida de ejemplo:

launchd(1)
 |- syslogd(38)
 |- UserEventAgent(39)
 |- kextd(41)
 |- fseventsd(42)
 |- thermald(44)
 |- appleeventsd(46)
...
 |- iTerm(2879)
 |   |- login(2883)
 |   |   '- -bash(2884)
 |   |       '- Python(17781)
 |   |           '- ps(17782)
 |   |- login(7091)
 |   |   '- -bash(7092)
 |   |       '- ssh(7107)
 |   '- login(7448)
 |       '- -bash(7449)
 |           '- bash(9040)
 |               '- python(9041)
 |- installd(2909)
 |- DataDetectorsDynamicData(3867)
 |- netbiosd(3990)
 |- firefox(5026)
...
    
respondido por el Meow 15.05.2016 - 21:25
0
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Pega esto en tu terminal para instalar Homebrew que te permitirá instalar pstree.

Luego instale pstree usando este comando

brew install pstree

Ahora puede usar el comando pstree en su terminal

En caso de que el comando de instalación falle, es decir, que solo el código de la aplicación no es suficiente en la versión de su sistema operativo, instale Command Line Developer Tools ejecutando este comando antes de instalar pstree.

xcode-select --install
    
respondido por el Ethan Stykes 17.12.2017 - 20:43

Lea otras preguntas en las etiquetas