Linux "ps f" (Tree View) -Äquivalent unter OSX?

85

Wie kann ich eine Baumansicht wie die folgende unter OSX erhalten?

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

Zur Verdeutlichung interessiert mich vor allem die Baumstruktur, nicht die erweiterten Informationen.

vartec
quelle

Antworten:

103

Sie können den pstreeBefehl mit Homebrew (meinem persönlichen Favoriten), MacPorts oder Fink installieren und erhalten eine Befehlszeilenstrukturansicht der Prozesse auf Ihrem Mac.

Wenn Homebrew installiert ist, führen Sie einfach Folgendes aus:

brew install pstree

Dann benutze es wie pstreein der Kommandozeile.

Ian C.
quelle
22

Das folgende kleine Perl-Skript habe ich "treeps" genannt, das genau das tun sollte. funktioniert unter Linux (Sci Linux 6) + OSX (10.6, 10.9)

Beispielausgabe:

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

Hier ist der Code ..

#!/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.
Greg Ercolano
quelle
1
Ich fand diese Antwort in einer Situation nützlich, in der ich Brew noch nicht installieren konnte (Debuggen von Packer + VMware-Problemen).
Amos Shapira
1
Dies ist eine großartige Antwort und auch ein guter Ausgangspunkt, aber es wäre nützlicher, wenn es eine Möglichkeit gäbe, Zeilen abzuschneiden, da sie in OSX sehr, sehr lang werden und sich im Terminalfenster verteilen. Irgendwelche Ideen dazu?
Rolf
3
@Rolf treeps | cut -c 1-$COLUMNSschneidet die langen Linien in der Breite Ihres aktuellen Terminalfensters ab. (oder eine einfache Zahl wie 100anstelle der $COLUMNSVariablen)
DouglasDD
Ähnlich wie bei Amos Shapira ist es das, wonach ich gesucht habe brew- es dauert lange, bis ich ein Update durchführe, und im Terminal, in dem es ausgeführt wird, wird nichts angezeigt. Für mich ist diese Antwort ein Juwel!
Landru27
9

Ich habe Greg Ercolanos Perl-Skript an das Python-Skript angepasst.

#!/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, '')

Beispielausgabe:

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)
...
Miau
quelle
2

Eine andere Option ist htop, die eine Option zum Anzeigen im Baumformat hat. Sie können entweder F5interaktiv drücken oder htop -tbeim Starten verwenden. Installieren:brew install htop

Bildbeschreibung hier eingeben

Quelle: ServerFault

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

Fügen Sie dies in Ihr Terminal ein, um Homebrew zu installieren, mit dem Sie pstree installieren können.

Dann installiere pstree mit diesem Befehl

brew install pstree

Jetzt können Sie den pstreeBefehl in Ihrem Terminal verwenden

Falls der Installationsbefehl fehlschlägt, dh Xcode allein in der Version Ihres Betriebssystems nicht ausreicht, installieren Sie die Command Line Developer Tools, indem Sie diesen Befehl ausführen, bevor Sie pstree installieren.

xcode-select --install
Ethan Stykes
quelle
1
Wie verbessert sich dies oder unterscheidet es sich von der alten akzeptierten Antwort apple.stackexchange.com/a/11806/237 ?
user151019
Ich nahm an, dass es einige Änderungen in der aktuellen Version von MacOS oder Xcode geben könnte, zum Beispiel musste ich vor der Installation von pstree die Command Line Developer Tools installieren.
Ethan Stykes
Nein, keine Änderung Sie brauchten immer Xcode-Befehlszeilen-Tools, wie in allen Installationsanweisungen für die 3 Paket-Manager
user151019
Oh !, hoffe, meine Antwort ist irgendwie nützlich für jemanden.
Ethan Stykes