#!/usr/local/bin/perl # # pstree Perl version for Digital Unix # (C) 1997 Erik Heinz, IKS GmbH Jena, # # 09/16/97 # # 05/05/1998 # changed for Solaris 2.5.1 by René Scholz ($NAME=$0) =~ s#.*/##; # get basename from $0 use Getopt::Std; $PS_CMD='/bin/ps -o uid -o pid -o ppid -o fname'; $USAGE=<) { my($uid,$pid,$ppid,$cmd)=split; # next if($pid eq 'PID' || $pid==0 || $ppid eq $$); next if($pid eq 'PID'); push @{$pchilds{$ppid}}, $pid; my $pinfo; if($opt_p) { $pinfo=$pid; } if($opt_u && $uid) { my $name=getpwuid($uid); if($pinfo) { $pinfo.=",$name"; } else { $pinfo = $name; } } if($pinfo) { $pcmd{$pid}="$cmd($pinfo)"; } else { $pcmd{$pid}= $cmd; } } close PSLIST; } sub compress { my @plist=@_; my $i; for ($i=0; $i<$#plist; $i++) { my $pid=$plist[$i]; next if(@{$pchilds{$pid}}); my $j=0; my $cmd=$pcmd{$pid}; while (($pcmd{$plist[$i+1]} eq $cmd) && (! @{$pchilds{$plist[$i+1]}}) && ($i<$#plist)) { $j++; splice @plist, $i+1, 1; } if($j) { $j++; $pcmd{$pid}="$j*[$cmd]"; } } return @plist; } sub print_childs # Use tput for printing better graphics { my ($ppid, $pre, $lspc)=@_; my (@plist, $pid, $lcmd); if($opt_G) { print $enacs; $S=$alt . "x" . $noalt; $W=$alt . "q" . $noalt; $W3=$alt . "qqq" . $noalt; $MPM=$alt . "qwq" . $noalt; $T=$alt . "tq" . $noalt; $M=$alt . "mq" . $noalt; } else { $S="|"; $W="-"; $W3="---"; $MPM="-+-"; } $lcmd=$pcmd{$ppid}; $pre.=' ' x length($lcmd); if($ppid>0) # !=0 { if($ppid==$ROOT) { print $lcmd; $pre.=" $S"; } else { print $lspc, $lcmd; $pre.=" $S"; } } if(exists $pchilds{$ppid}) { @plist=sort {$pcmd{$a} cmp $pcmd{$b}} @{$pchilds{$ppid}}; @plist=compress(@plist) unless ($opt_p); if(@plist==1) { print_childs($plist[0], $pre, $W3); } else { my ($i, $p0); print_childs($plist[0], $pre, $MPM); for ($i=1; $i<$#plist; $i++) { if(! $opt_G) { print_childs($plist[$i], $pre, "${pre}-"); } else { $_=substr($pre,0,$#pre-1); print_childs($plist[$i], $pre, "$_$T"); } } $p0=$pre; chop $p0; if(! $opt_G) { print_childs($plist[$i], $pre, "$p0`-"); } else { $_=$p0; chop; print_childs($plist[$i], $pre, "$_$M"); } } } else { print"\n"; } }