OSX에서 리눅스의`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 또는 Fink를pstree 사용 하여 명령을 설치할 수 있으며 Mac에서 프로세스의 트리를 볼 수 있습니다.

Homebrew가 설치된 상태에서 다음을 실행하십시오.

brew install pstree

그런 다음 pstree명령 행에서 와 같이 사용하십시오 .


22

아래의 작은 펄 스크립트는 정확하게 'treeps'라고 불렀습니다. 리눅스 (Sci Linux 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
이 답변은 아직 Brew를 설치할 수없는 상황에서 유용했습니다 (Packer + vmware 문제 디버깅).
Amos Shapira

1
이것은 훌륭한 답변이자 출발점이기도하지만 실제로 OSX에서 길어지고 터미널 창 안에 줄 바꿈되어 줄을자를 수있는 방법이 있다면 더 유용 할 것입니다. 이것에 대한 아이디어가 있습니까?
Rolf

3
@Rolf treeps | cut -c 1-$COLUMNS는 현재 터미널 창의 너비에서 긴 줄을 잘라냅니다. (또는 변수 100대신 간단한 숫자 $COLUMNS)
DouglasDD

아모스 샤피 라 (Amos Shapira)의 상황과 비슷하게, 내가 찾고 brew있는 것은 업데이트하는 데 오랜 시간이 걸리고 터미널에서 실행중인 곳은 아무 것도 알려주지 않는 것입니다. 저에게이 대답은 보석입니다!
landru27

9

Greg Ercolano의 펄 스크립트를 파이썬 스크립트에 적용했습니다.

#!/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

여기에 이미지 설명을 입력하십시오

출처 : ServerFault


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

이것을 pstree를 설치할 수 있도록 Homebrew를 설치하기 위해 터미널에 붙여 넣으십시오.

그런 다음이 명령을 사용하여 pstree를 설치하십시오.

brew install pstree

이제 pstree터미널 에서 명령을 사용할 수 있습니다

설치 명령이 실패하는 경우 (예 : OS 버전에서 Xcode만으로는 충분하지 않은 경우) pstree를 설치하기 전에이 명령을 실행하여 명령 행 개발자 도구를 설치하십시오.

xcode-select --install

1
이것이 이전에 허용 된 답변 apple.stackexchange.com/a/11806/237 에서 어떻게 향상되거나 다른 가요 ?
user151019

예를 들어 pstree를 설치하기 전에 명령 행 개발자 도구를 설치해야하는 등 MacOS 또는 Xcode의 현재 버전에 일부 변경 사항이있을 수 있다고 가정했습니다.
Ethan Stykes

3 개의 패키지 관리자를위한 모든 설치 지침에 언급 된대로 항상 Xcode 명령 줄 도구가 필요했습니다
user151019

오!, 내 대답이 어떻게 든 누군가에게 유용하기를 바랍니다.
Ethan Stykes '12
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.