Setara dengan 'ps f` (tampilan pohon) Linux di OSX?

85

Bagaimana saya bisa mendapatkan tampilan struktur pohon seperti di bawah ini di 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

Untuk memperjelas, saya lebih tertarik pada struktur pohon, bukan informasi yang diperluas.

vartec
sumber

Jawaban:

103

Anda dapat menginstal pstreeperintah menggunakan Homebrew (favorit pribadi saya), MacPorts atau Fink dan Anda akan mendapatkan baris perintah, tampilan hierarki proses di Mac Anda.

Dengan Homebrew terinstal, jalankan saja:

brew install pstree

kemudian gunakan seperti pstreedari baris perintah.

Ian C.
sumber
22

Di bawah ini skrip perl kecil yang saya sebut 'treeps' yang seharusnya melakukan itu; bekerja di linux (Sci Linux 6) + OSX (10.6, 10.9)

Contoh 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

Ini kodenya ..

#!/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
sumber
1
Saya menemukan jawaban ini berguna dalam situasi di mana saya belum dapat menginstal Brew (debugging masalah Packer + vmware).
Amos Shapira
1
Ini adalah jawaban yang bagus dan titik awal yang baik juga, tetapi akan lebih berguna jika ada cara untuk memotong garis, karena mereka mendapatkan OSX yang sangat, sangat panjang dan membungkus di dalam jendela terminal. Ada ide tentang ini?
Rolf
3
@Rolf treeps | cut -c 1-$COLUMNSakan memotong garis panjang di lebar jendela terminal Anda saat ini. (atau nomor sederhana seperti 100bukan $COLUMNSvariabel)
DouglasDD
mirip dengan situasi Amos Shapira, apa yang saya cari ini brewsendiri - butuh waktu lama untuk memperbarui, dan tidak memberi tahu saya apa pun di terminal tempat ia beroperasi; jadi, bagi saya, jawaban ini adalah permata!
landru27
9

Saya mengadaptasi skrip perl Greg Ercolano ke skrip 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, '')

Contoh 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)
...
meong
sumber
2

Opsi lainnya adalah htop, yang memiliki opsi untuk ditampilkan dalam format hierarki. Anda dapat pers F5secara interaktif, atau gunakan htop -tsaat peluncuran itu. Untuk memasang:brew install htop

masukkan deskripsi gambar di sini

Sumber: ServerFault

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

Rekatkan ini di terminal Anda untuk menginstal Homebrew yang memungkinkan Anda menginstal pstree.

Kemudian instal pstree menggunakan perintah ini

brew install pstree

Sekarang Anda dapat menggunakan pstreeperintah di terminal Anda

Jika perintah instalasi gagal, mis. Xcode saja tidak cukup pada versi OS Anda, instal Alat Pengembang Baris Perintah dengan menjalankan perintah ini sebelum menginstal pstree.

xcode-select --install
Ethan Stykes
sumber
1
Bagaimana hal ini meningkatkan atau berbeda dengan jawaban apple.stackexchange.com/a/11806/237 yang diterima lama ?
user151019
Saya berasumsi mungkin ada beberapa perubahan dalam versi MacOS atau Xcode saat ini, misalnya saya harus menginstal Alat Pengembang Baris Perintah sebelum menginstal pstree.
Ethan Stykes
Tidak ada perubahan, Anda selalu membutuhkan alat baris perintah Xcode seperti yang disebutkan dalam semua instruksi instal untuk 3 manajer paket
user151019
Oh !, semoga jawaban saya bermanfaat bagi seseorang.
Ethan Stykes