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.

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.


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

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.