답변:
아래의 작은 펄 스크립트는 정확하게 '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.
treeps | cut -c 1-$COLUMNS
는 현재 터미널 창의 너비에서 긴 줄을 잘라냅니다. (또는 변수 100
대신 간단한 숫자 $COLUMNS
)
brew
있는 것은 업데이트하는 데 오랜 시간이 걸리고 터미널에서 실행중인 곳은 아무 것도 알려주지 않는 것입니다. 저에게이 대답은 보석입니다!
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)
...
또 다른 옵션은 htop
트리 형식으로 표시하는 옵션이 있습니다. F5
대화식 으로 누르 거나 htop -t
시작할 때 사용할 수 있습니다 . 설치하기 위해서:brew install htop
출처 : ServerFault
/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