OSX पर Linux का `ps f` (ट्री व्यू) बराबर?


85

मैं 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

स्पष्ट करने के लिए, मैं ज्यादातर पेड़ की संरचना में दिलचस्पी रखता हूं, विस्तारित जानकारी नहीं।

जवाबों:


103

आप Homebrew (मेरे व्यक्तिगत पसंदीदा), MacPorts या फिंकpstree का उपयोग करके कमांड स्थापित कर सकते हैं और आपको अपने मैक पर प्रक्रियाओं का कमांड-लाइन, ट्री व्यू मिलेगा।

Homebrew स्थापित के साथ, बस चलाएँ:

brew install pstree

फिर pstreeकमांड लाइन से इसका उपयोग करें ।


22

नीचे की छोटी पर्ल स्क्रिप्ट मैंने 'ट्रीप्स' कहा है जो कि ठीक यही करना चाहिए; लिनक्स पर काम करता है (विज्ञान लिनक्स 6) + OSX (10.6, 10.9)

उदाहरण आउटपुट:

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

यहाँ कोड है ..

#!/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
मुझे यह उत्तर ऐसी स्थिति में उपयोगी लगा, जहाँ मैं अभी तक ब्रू स्थापित नहीं कर सका (पैकरिंग + vmware मुद्दों को डिबग करना)।
आमोस शापिरा

1
यह एक शानदार उत्तर और एक शानदार शुरुआती बिंदु है, लेकिन यह अधिक उपयोगी होगा अगर वहाँ लाइनों को छोटा करने का एक तरीका था, जैसा कि वे वास्तव में प्राप्त करते हैं, वास्तव में ओएसएक्स में लंबे समय तक और टर्मिनल विंडो के अंदर लपेटते हैं। इस बारे में कोई विचार?
रॉल्फ

3
@ रॉल्फ treeps | cut -c 1-$COLUMNSआपके वर्तमान टर्मिनल विंडो की चौड़ाई पर लंबी लाइनों को काट देगा। (या चर के 100बजाय एक साधारण संख्या की तरह $COLUMNS)
डगलसडीडी

आमोस शापिरा की स्थिति के समान, मुझे जो भी दिख रहा है वह brewखुद है - अपडेट करने में लंबा समय लग रहा है, और मुझे टर्मिनल में कुछ भी नहीं बता रहा है कि यह कहां चल रहा है; तो, मेरे लिए, यह जवाब एक रत्न है!
landru27

9

मैंने ग्रेग एरोलानो की पर्ल स्क्रिप्ट को अजगर स्क्रिप्ट के अनुकूल बनाया।

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

उदाहरण आउटपुट:

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

एक अन्य विकल्प है htop, जिसमें ट्री प्रारूप में प्रदर्शित करने का विकल्प है। आप या तो F5अंतःक्रियात्मक रूप से दबा सकते हैं , या htop -tइसे लॉन्च करते समय उपयोग कर सकते हैं । स्थापित करने के लिए:brew install htop

यहाँ छवि विवरण दर्ज करें

स्रोत: सर्वरफॉल्ट


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

Homebrew स्थापित करने के लिए अपने टर्मिनल में इसे चिपकाएँ जो आपको pstree स्थापित करने देगा।

फिर इस कमांड का उपयोग करके pstree स्थापित करें

brew install pstree

अब आप pstreeअपने टर्मिनल में कमांड का उपयोग कर सकते हैं

यदि इंस्टॉलेशन कमांड विफल हो जाता है, अर्थात। केवल आपके ओएस के संस्करण पर पर्याप्त नहीं है, pstree स्थापित करने से पहले इस कमांड को चलाकर कमांड लाइन डेवलपर टूल इंस्टॉल करें।

xcode-select --install

1
पुराने स्वीकार किए गए उत्तर Apple.stackexchange.com/a/11806/237 पर यह कैसे सुधरता है या भिन्न होता है ?
user151019

मैंने मान लिया कि MacOS या Xcode के वर्तमान संस्करण में कुछ बदलाव हो सकते हैं, उदाहरण के लिए मुझे pstree स्थापित करने से पहले कमांड लाइन डेवलपर टूल इंस्टॉल करना था।
ईथन स्टाइल्स

3 पैकेज प्रबंधकों के लिए सभी
इंस्टॉलेशन

ओह !, आशा है कि मेरा उत्तर किसी न किसी तरह से उपयोगी होगा।
ईथन स्टाइल्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.