forked from jwbargsten/perl-proc-processtable
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Killfam.pm
83 lines (56 loc) · 1.31 KB
/
Killfam.pm
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
$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/;
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::Killfam;
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