লিনাক্সের `পিএসএফ (গাছের দৃশ্য) ওএসএক্সের সমান?


85

ওএসএক্সের নীচের মত একটি গাছের ভিউ আমি কীভাবে পেতে পারি?

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

আপনি হোমব্রেইউ (আমার ব্যক্তিগত প্রিয়), ম্যাকপোর্টস বা ফিংকpstree ব্যবহার করে কমান্ডটি ইনস্টল করতে পারেন এবং আপনার ম্যাকের প্রক্রিয়াগুলির জন্য একটি কমান্ড-লাইন, ট্রি ভিউ পাবেন।

হোমব্রু ইনস্টল হয়ে, কেবল চালান:

brew install pstree

pstreeকমান্ড লাইন থেকে এটি ব্যবহার করুন ।


22

নীচের ছোট্ট পার্ল স্ক্রিপ্টটি আমি 'ট্রিপস' বলেছি যা ঠিক এটি করা উচিত; লিনাক্সে কাজ করে (সায়েন্স লিনাক্স 6) + ওএসএক্স (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
আমি এই উত্তরটি এমন পরিস্থিতিতে কার্যকরভাবে পেয়েছি যেখানে আমি এখনও ব্রিউ ইনস্টল করতে পারিনি (প্যাকার + ভিএমওয়্যার সমস্যাগুলি ডিবাগ করা)।
আমোষ শাপিরা

1
এটি দুর্দান্ত উত্তর এবং একটি দুর্দান্ত সূচনা পয়েন্ট, তবে লাইনগুলি কেটে দেওয়ার কোনও উপায় থাকলে, এটি ওএসএক্সে সত্যই দীর্ঘায়িত হয়ে টার্মিনাল উইন্ডোটির অভ্যন্তরে আবৃত থাকলে এটি আরও কার্যকর হবে। এ সম্পর্কে কোন ধারণা?
রল্ফ

3
@ রলফ treeps | cut -c 1-$COLUMNSআপনার বর্তমান টার্মিনাল উইন্ডোর প্রস্থে দীর্ঘ লাইনগুলি কেটে দেবে। (অথবা ভেরিয়েবলের 100পরিবর্তে একটি সাধারণ সংখ্যা $COLUMNS)
ডগলাসডিডি

আমোস Shapira অবস্থা, কি আমাকে এই খুঁজছেন হয়েছে অনুরূপ 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
এটি কীভাবে পুরানো স্বীকৃত উত্তর আপেল.স্ট্যাকেক্সচেঞ্জ / এ / 11806/237 এর থেকে আলাদা হবে বা আলাদা হবে ?
ব্যবহারকারী 151019

আমি ধরে নিয়েছি ম্যাকোস বা এক্সকোডের বর্তমান সংস্করণে কিছু পরিবর্তন হতে পারে, উদাহরণস্বরূপ, pstree ইনস্টল করার আগে আমাকে কমান্ড লাইন বিকাশকারী সরঞ্জাম ইনস্টল করতে হয়েছিল।
ইথান স্টাইকস

কোনও পরিবর্তন নেই আপনার সর্বদা Xcode কমান্ড লাইন সরঞ্জামগুলির প্রয়োজন 3 প্যাকেজ পরিচালকদের সমস্ত ইনস্টল নির্দেশাবলী অনুসারে
ব্যবহারকারীর 151019

ওহ! আশা করি আমার উত্তরটি কারও কারও উপকারে আসবে।
ইথান স্টাইকস
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.