Something like /usr/proc/bin/ptree [pid] in SunOS.
Similar thing available in psin, but requires Photon.
Of course if you want more functions for this
(like dumping “pidin mem” along?) you should whip up a C program
but just getting the tree was possible with single pidin and awk.
kabe
#!/bin/sh
#if __USAGE
#%C - print the process tree
#Usage:
ptree [pid]
#endif
STARTPID=1
if [ $# -gt 0 ]; then STARTPID=$1; shift; fi
using “pidin -f A” screws a lot if any command’s argument had “\n”
pidin -F ‘%e %a %n’ | awk -v startpid=$STARTPID ’
ppid pid args
{
if ($1 == “1” && $2 == “procnto”) {
ppid=1; pid=1; args=" procnto";
largs[pid]=args;
} else {
ppid=$1; pid=$2;
$1=""; $2=""; args=$0;
#sub("\n"," ");
if ( ! largs[pid]) {
stash info:
largs[pid] command name
lchild[pid,0…childs[pid]-1] pids of children
parentof[pid]
largs[pid]=args;
t=childs[ppid]+0; lchild[ppid,t]=pid; childs[ppid]++;
parentof[pid]=ppid;
}
}
}
function ptree(pid,sprefix, i) {
printf("%s%d%s\n", sprefix,pid,largs[pid]);
if (childs[pid]) {
for (i=0; i < childs[pid]; i++) {
ptree(lchild[pid,i], sprefix " ", depth+1);
}
}
}
END {
pid = startpid;
if (pid != 1 && ! parentof[pid]) {
print pid “: no process”
exit
}
backtrack up
blen = 0;
while (pid != 1) {
blist[blen++]=pid;
pid = parentof[pid];
}
blist[0…blen-1] = startpid,p(startpid),…1
descend from 1 until startpid
sprefix="";
while (pid != startpid) {
printf("%s%d%s\n", sprefix,pid,largs[pid]);
pid = blist[–blen];
sprefix=sprefix " ";
}
full tree below
ptree(pid, sprefix);
}
’