저는 Solaris ptree와 동일한 출력을 인쇄하는 Linux 도구를 찾고 있습니다. 예를 들어:
# ptree 538
538 /usr/lib/ssh/sshd
889 /usr/lib/ssh/sshd
890 /usr/lib/ssh/sshd
1498 -sh
1649 bash
1656 -sh
1660 bash
13716 ptree 538
나는 pstree가 존재한다는 것을 알고 있지만 그 출력 형식이 마음에 들지 않습니다. 비슷한 도구를 아는 사람이 있습니까?
답변1
이것은 내가 아는 Linux의 ptree와 가장 유사합니다.
ps -ejH
답변2
다음은 Solaris와 유사한 출력을 표시하는 스크립트입니다.나무. 옵션이 지원되지 않으며 사용자 일치도 지원되지 않습니다. 이 스크립트는 모든 POSIX 시스템에 이식 가능해야 합니다. 일부 명령이 POSIX와 호환되지 않는 시스템에서는 ps
에 전달되는 내용을 조정해야 할 수도 있습니다 ps
. 스크립트에는 BSD 시스템에 대한 특정 지원이 포함되어 있으므로 대부분의 플랫폼을 포괄해야 합니다.
#! /bin/sh
## Usage: $0 [PID...]
## Show the processes on the system. For each process, show the process
## id followed by the command line. Show child processes after their parent,
## indented.
## If one or more PIDs are specified, only show the ancestors and
## descendants of those PIDs. If no PID is specified, show the subtree
## rooted at PID 1.
## This utility mimics Solaris pstree(1).
case $(uname) in *BSD*) ps_A='-ax';; *) ps_A='-A';; esac
ps $ps_A -o pid= -o ppid= -o args= |
sort -k 1n |
awk -v targets="$*" '
# children[p]: the " "-separated list of the pids of the children of p
# cmd[p]: command line of p
# list[lb..le]: list of pids yet to traverse
# depth[p]: depth of process p: depth(child) = depth(parent) + 1
# parent[p]: pid of the parent of p
# show[p]: 1 to show p, 2 to show p and all its descendants
BEGIN {
list[0] = 0; lb = 0; le = 0;
depth[0] = -1;
}
{
pid=$1; ppid=$2;
sub(/^ *[0-9]+ +[0-9]+ /, "");
if (pid == ppid) {
# This process is a root: add it to the list of processes to taverse
list[++le] = pid;
} else {
children[ppid] = children[ppid] " " pid;
parent[pid] = ppid;
}
cmd[pid] = $0;
}
END {
# Parse targets into a list of pids (or 1 if none is specified).
split("_" targets, a, /[^0-9]+/);
delete a[1];
if (a[2] == "") a[2] = 1;
for (i in a) {
show[a[i]] = 2; # Show targets recursively
p = parent[a[i]];
# Show target ancestors
while (p && !show[p]) {
show[p] = 1;
p = parent[p];
}
}
# Traverse the list of processes
while (lb <= le) {
pid = list[lb++];
# Add children to the list of processes to traverse
split(children[pid], a);
for (i in a) {
list[--lb] = a[i];
depth[a[i]] = depth[pid] + 1;
if (show[pid] > 1) show[a[i]] = show[pid];
}
# Show the current process if desired, indenting to the right depth
if (show[pid]) {
for (i = 1; i <= depth[pid]; i++) printf(" ");
printf("%-5d ", pid);
print cmd[pid];
}
}
}
'
답변3
이것은 당신이 찾고 있는 것이 아닐 수도 있지만 다른 사람들은 그것을 좋아할 수도 있습니다.
htop
누르면 트리 보기가 나타납니다 F5.
답변4
아마도 pstree
그것이 계산서에 맞을 것입니까?