Proc::Killfam

Also in "Anatomy of the MainLoop", we used the killfam command. Here's the code we promised for that command:

$Proc::Killfam::VERSION = '1.0'; package Proc::Killfam; use Exporter; use base qw/Exporter/; use subs qw/get_pids/; use vars qw/@EXPORT @EXPORT_OK $ppt_OK/; use strict; @EXPORT = qw/killfam/; @EXPORT_OK = qw/killfam/; # We need Proc::ProcessTable to work properly. If it's not available, # then we act like Perl's builtin kill( ) command. BEGIN {
 $ppt_OK = 1; eval "require Proc::ProcessTable"; if ($@) {
 $ppt_OK = 0; warn "Proc::ProcessTable missing, can't kill sub-children.";
}
} sub killfam {
 my($signal, @pids) = @_; if ($ppt_OK) {
 my $pt = Proc::ProcessTable->new; my(@procs) = @{$pt->table};
 my(@kids) = get_pids \@procs, @pids; @pids = (@pids, @kids);
}
kill $signal, @pids;
}
# end killfam sub get_pids {
 my($procs, @kids) = @_; my @pids; foreach my $kid (@kids) {
 foreach my $proc (@$procs) {
 if ($proc->ppid == $kid) {
 my $pid = $proc->pid; push @pids, $pid, get_pids $procs, $pid;
}
}
}
@pids;
}
# end get_pids 1; __END__ =head1 NAME Proc::Killfam - kill a list of pids, and all their sub-children =head1 SYNOPSIS use Proc::Kilfam; killfam $signal, @pids; =head1 DESCRIPTION B<killfam> accepts the same arguments as the Perl builtin B<kill> command, but, additionally, recursively searches the process table for children and kills them as well. =head1 EXAMPLE B<killfam 'TERM', ($pid1, $pid2, @more_pids)>; =head1 KEYWORDS kill, signal =cut