What I really want to do is call B from another Perl script A, and A kills B (with system("kill PID") or whatever), thereby killing C as well.
One way to do that is to localize the HUP signal handler and then send a HUP signal to your process group. You can have A do
{
local $SIG{HUP} = 'IGNORE';
kill HUP => -$$;
}
I've attached a proof of concept demo. Sorry there's no backport, I got lazy once I had it working.
a.pl
#!/opt/perl/bin/perl
use 5.012;
use warnings;
say "A start";
my $pid;
unless ( $pid = fork ) {
die "cannot fork: $!" unless defined $pid;
system("./b.pl");
sleep 30;
exit;
}
sleep 2;
say "A sending kill HUP -$$";
{
local $SIG{HUP} = 'IGNORE';
kill HUP => -$$;
}
say "A waiting for lost children";
while (1) {
my $kid = waitpid -1, 0;
$kid == -1 and last;
say "A reaped child $kid";
}
say "A end";
b.pl
#!/opt/perl/bin/perl
use 5.012;
use warnings;
say " B start";
my $pid;
unless ($pid = fork) {
die "cannot fork: $!" unless defined $pid;
system("./c.pl");
sleep 30;
exit;
}
say " B waiting on lost children";
while (1) {
my $kid = waitpid -1, 0;
$kid == -1 and last;
say " B reaped child $kid";
}
sleep 30;
say " B end";
c.pl
#!/opt/perl/bin/perl
use 5.012;
use warnings;
say " C start";
sleep 30;
say " C exit";
output
$ ./a.pl
A start
B start
B waiting on lost children
C start
A sending kill HUP -20682
A waiting for lost children
A reaped child 20683
A end