Linux '`ps f` (ağaç görünümü) OSX'e denk mi?


85

OSX'te aşağıdakine benzer bir ağaç görünümünü nasıl bulabilirim?

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

Açıklığa kavuşturmak için, çoğunlukla genişletilmiş bilgilerle değil, ağaç yapısıyla ilgileniyorum.

Yanıtlar:


103

pstreeKomutu Homebrew (kişisel favorim), MacPorts veya Fink kullanarak yükleyebilir ve Mac'inizde işlemlerin bir komut satırını, ağaç görünümünü elde edersiniz.

Homebrew kurulu iken, sadece çalıştırın:

brew install pstree

daha sonra pstreekomut satırındaki gibi kullanın .


22

Aşağıdaki küçük perl betiği tam olarak yapması gereken 'sürüngen' olarak adlandırdım; Linux üzerinde çalışır (Sci Linux 6) + OSX (10.6, 10.9)

Örnek çıktı:

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

İşte kod ..

#!/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
Bu cevabı henüz Brew'ı kuramadığım bir durumda yararlı buldum (Packer + vmware hatalarını ayıklama).
Amos Shapira

1
Bu harika bir cevap ve aynı zamanda harika bir başlangıç ​​noktasıdır, ancak OSX'te gerçekten çok uzun sürdüğü ve terminal penceresinin içine sarıldığı gibi çizgileri kesmenin bir yolu olsaydı daha faydalı olurdu. Bu konuda fikrin var mı?
Rolf

3
@Rolf treeps | cut -c 1-$COLUMNS, geçerli terminal pencerenizin genişliğindeki uzun çizgileri keser. (veya değişken 100yerine basit bir sayı $COLUMNS)
DouglasDD

Amos Shapira'nın durumuna benzer şekilde, bunun için beni arayan şey ise brew- güncellenmesi uzun zaman alıyor ve çalıştığı terminalde hiçbir şey söylemiyor; öyleyse, benim için bu cevap bir mücevher!
landru27

9

Greg Ercolano'nun perl betiğini python betiğine uyarladım.

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

Örnek çıktı:

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

htopAğaç biçiminde görüntüleme seçeneği olan başka bir seçenek. F5Etkileşimli olarak basabilir veya htop -tbaşlatırken kullanabilirsiniz . Yüklemek:brew install htop

görüntü tanımını buraya girin

Kaynak: ServerFault


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

Bunu pstree'yi yerleştirmenize izin verecek Homebrew'i kurmak için terminalinize yapıştırın.

Sonra bu komutu kullanarak pstree'yi kurun

brew install pstree

Şimdi pstreeterminalinizdeki komutu kullanabilirsiniz.

İnstall komutunun başarısız olması durumunda, yani işletim sisteminizin versiyonunda tek başına Xcode yeterli olmazsa, pstree'yi kurmadan önce bu komutu çalıştırarak Komut Satırı Geliştirici Araçları'nı kurun.

xcode-select --install

1
Bu, kabul edilen eski cevaba göre nasıl gelişir veya farklı olur apple.stackexchange.com/a/11806/237 ?
user151019

MacOS veya Xcode'un mevcut sürümünde bazı değişiklikler olabileceğini varsaydım, örneğin pstree'yi yüklemeden önce Komut Satırı Geliştirici Araçları'nı kurmam gerekti.
Ethan Stykes

Değişiklik yok, her zaman 3 paket yöneticisinin tüm kurulum talimatlarında belirtildiği gibi Xcode komut satırı araçlarına ihtiyacınız var
user151019

Oh!, Cevabım bir şekilde birileri için yararlı olacağını umuyorum.
Ethan Stykes
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.