Aquí hay un script que muestra resultados similares a los de Solaris pstree . No se admite ninguna opción y no se admite la coincidencia de usuarios. Este script debe ser portátil para todos los sistemas POSIX. En algunos sistemas cuyo ps
comando no es compatible con POSIX, es posible que deba ajustar las opciones que se le pasaron ps
. El script incluye soporte específico para sistemas BSD, por lo que la mayoría de las plataformas deberían estar cubiertas.
#! /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
. Lo encuentro más legible.