Linux 'ps f` (vista ad albero) equivalente su OSX?


85

Come posso ottenere una vista ad albero come quella qui sotto su 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

Per chiarire, sono principalmente interessato alla struttura ad albero, non alle informazioni estese.

Risposte:


103

Puoi installare il pstreecomando usando Homebrew (il mio preferito personale), MacPorts o Fink e otterrai una riga di comando, vista ad albero dei processi sul tuo Mac.

Con Homebrew installato, esegui:

brew install pstree

quindi usalo come pstreeda riga di comando.


22

Il seguente piccolo script perl che ho chiamato 'treeps' che dovrebbe fare esattamente questo; funziona su linux (Sci Linux 6) + OSX (10.6, 10.9)

Esempio di output:

$ ./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

Ecco il codice ..

#!/usr/bin/perl
# treeps -- show ps(1) as process hierarchy -- v1.0 erco@seriss.com 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.

1
Ho trovato questa risposta utile in una situazione in cui non ho ancora potuto installare Brew (debug Packer + problemi vmware).
Amos Shapira

1
Questa è un'ottima risposta e anche un ottimo punto di partenza, ma sarebbe più utile se ci fosse un modo per troncare le linee, poiché diventano molto, molto lunghe in OSX e si avvolgono nella finestra del terminale. Qualche idea su questo?
Rolf,

3
@Rolf treeps | cut -c 1-$COLUMNStaglierà le lunghe file alla larghezza della finestra del terminale corrente. (o un numero semplice come al 100posto della $COLUMNSvariabile)
DouglasDD

simile alla situazione di Amos Shapira, ciò che mi sta cercando è esso brewstesso: impiegare molto tempo per l'aggiornamento e non dirmi nulla nel terminale dove sta funzionando; quindi, per me, questa risposta è una gemma!
landru27,

9

Ho adattato lo script perl di Greg Ercolano allo script di 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, '')

Esempio di output:

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)
...

2

Un'altra opzione è htop, che ha un'opzione da visualizzare in formato ad albero. È possibile premere in modo F5interattivo o utilizzare htop -tall'avvio. Installare:brew install htop

inserisci qui la descrizione dell'immagine

Fonte: ServerFault


1
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"

Incollalo nel tuo terminale per installare Homebrew che ti permetterà di installare pstree.

Quindi installare pstree usando questo comando

brew install pstree

Ora puoi usare il pstreecomando nel tuo terminale

Nel caso in cui il comando install non abbia esito positivo, vale a dire che Xcode da solo non è sufficiente sulla versione del sistema operativo in uso, installare gli Strumenti per sviluppatori della riga di comando eseguendo questo comando prima di installare pstree.

xcode-select --install

1
In che modo questo migliora o differisce dalla vecchia risposta accettata apple.stackexchange.com/a/11806/237 ?
user151019

Ho pensato che potrebbero esserci delle modifiche nella versione corrente di MacOS o Xcode, ad esempio ho dovuto installare gli strumenti di sviluppo della riga di comando prima di installare pstree.
Ethan Stykes,

Nessuna modifica, hai sempre avuto bisogno degli strumenti della riga di comando Xcode come menzionato in tutte le istruzioni di installazione per i 3 gestori di pacchetti
user151019

Oh !, spero che la mia risposta possa essere utile a qualcuno in qualche modo.
Ethan Stykes,
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.