Berikut ini skrip yang menampilkan keluaran yang mirip dengan Solaris pstree . Tidak ada opsi yang didukung, dan pencocokan pengguna tidak didukung. Skrip ini harus portabel untuk semua sistem POSIX. Pada beberapa sistem yang ps
perintahnya tidak sesuai dengan POSIX, Anda mungkin perlu menyesuaikan opsi yang diteruskan ps
. Skrip menyertakan dukungan spesifik untuk sistem BSD, sehingga sebagian besar platform harus dicakup.
#! /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];
}
}
}
'
ps axf
. Saya merasa lebih mudah dibaca.