On Tue, Jun 11, 2002 at 05:15:17AM -0700, Juli Mallett wrote:
> Hej,
>
> As some of you may have noticed, I've done some poking of ps(1) lately, and
> this has brought attention of people who have ideas for things that they
> would like to see done to ps(1) :) The most notable request was for a
> feature I've missed having in our ps(1) for a while, the ability to get a
> tree of processes printed so you can tell who is whose child, etc.
>
> ps(1)'s internals, however, didn't seem quite right to me, but after about
> 10 minutes reading kvm(3) manpages and recalling some tricks with recursive
> programming to produce an N-level tree with as many as N-1 elements, I had
> come up with a simple utility to print out a "process tree".
>
> You can find the code here:
> http://people.freebsd.org/~jmallett/.proctree/proctree.c
>
> And some example output from a cluster machine here:
> http://people.freebsd.org/~jmallett/.proctree/proctree.out
> Lots of people have given feedback that they don't care much for the \_
> formatting of the tree, and I'm willing to look at patches that provide
> noticably more readable output.
how about this one ?
1 ? 0 \_ init
2814 ttyp0 0 \_ sh
2816 ttyp0 0 | \_ sh
57423 ? 0 | \_ sleep
2596 ? 0 \_ inetd
24834 ? 0 | \_ rlogind
24838 ttyp0 0 | | \_ ksh
24912 ttyp0 0 | | \_ ksh
57504 ? 0 | \_ telnetd
^^^^^^^^^^^^^^^^^^^^^^ command tree
^^^^^^^^^^^^^^^^^^^^ standard ps fields
taken from ast-open `ps -T'. see http://www.research.att.com/~gsf/download/tgz/
for details (maybe one I'll will finish this !@#$%^&* port which is still
broken in some way ?)
for fun, how about a simple awk script like the one in attachment ;^)
Cyrille.
--
Cyrille Lefevre mailto:[EMAIL PROTECTED]
#!/bin/sh
# was ps -ef
ps axwo "user pid ppid start tt time command" |
awk '
BEGIN {
getline
}
{
if (! nchild[$3])
nchild[$3] = 0
father[$2] = $3
children[$3, nchild[$3]] = $2
nchild[$3] ++
start[$2] = $4
tty[$2] = $5
time[$2] = $6
cmd[$2] = $7
for (i = 8; i <= NF; i++)
cmd[$2] = cmd[$2] " " $i
}
function print_parents(pid) {
if (pid != 1)
prefix = " " print_parents(father[pid])
else
prefix = " "
printf "%6i %6i %7s %s %s %s\\_ %s\n", \
pid, father[pid], start[pid], tty[pid], time[pid], \
substr(prefix, 1, length(prefix)-2), cmd[pid]
return " " prefix
}
function print_children (pid, prefix, child) {
printf "%6i %6i %7s %s %s %s\\_ %s\n", \
pid, father[pid], start[pid], tty[pid], time[pid], \
substr(prefix, 1, length(prefix)-2), cmd[pid]
if (! nchild[pid])
return
for (child = 0; child < nchild[pid] - 1; child ++)
print_children(children[pid, child], prefix " | ")
print_children(children[pid, child], prefix " ")
}
END {
if (! whichpid)
whichpid = 1
if (! cmd[whichpid])
exit
if (father[whichpid])
prefix = " " print_parents(father[whichpid])
else
prefix = " "
print_children(whichpid, prefix)
}' whichpid=$1