PID => [ PPID, COMMAND ]
####
#!/usr/bin/env perl
use strict;
use warnings;
my (%ps_data, @defunct_processes);
while () {
next if $. == 1; # Skip header: 'PID PPID COMMAND'
chomp;
my ($pid, $ppid, $cmd) = split ' ', $_, 3;
$ps_data{$pid} = [$ppid => $cmd];
push @defunct_processes, $pid if $cmd eq '';
}
for my $pid (@defunct_processes) {
my @trace;
while ($pid >= 1) {
push @trace, [$pid, @{$ps_data{$pid}}];
$pid = $ps_data{$pid}[0];
}
printf "%4d %4d %s\n", @$_ for reverse @trace;
}
__DATA__
PID PPID COMMAND
0 0 sched
1 0 /sbin/init
7 0 vmtasks
105 1 /usr/lib/saf/sac
7184 1 /usr/bin/java
7222 1 /usr/lib/utmpd
7501 6223 /usr/sbin/nscd
7507 7184 /bin/sh
7508 7507 /usr/bin/perl
7510 5044 /usr/bin/grep
7512 4333 /usr/bin/egrep
7515 7508 sh
7516 7515
####
1 0 /sbin/init
7184 1 /usr/bin/java
7507 7184 /bin/sh
7508 7507 /usr/bin/perl
7515 7508 sh
7516 7515