#!/usr/local/bin/perl -w use strict; use Getopt::Std; use ExtUtils::testlib; use Solaris::Procfs qw(:procfiles getpids); use lib '.'; use vars qw($opt_a); getopts('a'); my $pid; my %psargs = (); my %children = (); my %ischild = (); my @pidlist = (@ARGV ? @ARGV : getpids() ); while (defined($pid = shift @pidlist) ) { my $psinfo = psinfo($pid); unless (defined $psinfo and ref $psinfo eq 'HASH') { warn "Cannot get psinfo on process $pid: $!\n"; next; } my $parent = $psinfo->{pr_ppid}; next unless $parent > 0 or $opt_a; ($psargs{$pid} = $psinfo->{pr_psargs}) =~ s/\n//gm; next unless $parent > 1 or $opt_a and $parent > 0; $children{$parent}->{$pid} = 1; push @pidlist, $parent unless exists $psargs{$parent}; $ischild{$pid} = 1; } foreach $pid ( sort { $a <=> $b } keys %psargs ) { next if $ischild{$pid}; print_pid($pid,0); } sub print_pid { my ($pid,$gen) = @_; printf( "%s%-5d %s\n", " " x $gen, $pid, $psargs{$pid} ); return unless defined $children{$pid}; foreach ( sort { $a <=> $b } keys %{ $children{$pid} } ) { print_pid($_,$gen+1); } }