App-Base
view release on metacpan or search on metacpan
lib/App/Base/Daemon/Supervisor.pm view on Meta::CPAN
=head2 $self->ping_supervisor
Should only be called from supervised process. Checks if supervisor is alive
and initiates shutdown if it is not.
=cut
sub ping_supervisor {
my $self = shift;
my $pipe = $self->supervisor_pipe or $self->error("Supervisor pipe is not defined");
say $pipe "ping";
my $pong = <$pipe>;
unless (defined $pong) {
$self->error("Error reading from supervisor pipe: $!");
}
return;
}
=head2 $self->ready_to_take_over
Used to support hot reloading. If daemon support hot restart,
I<supervised_process> is called while the old daemon is still running.
I<supervised_process> should perform initialization, e.g. open listening
sockets, and then call this method. Method will cause termination of old daemon
and after return the new process may start serving clients.
=cut
sub ready_to_take_over {
my $self = shift;
my $pipe = $self->supervisor_pipe or die "Supervisor pipe is not defined";
say $pipe "takeover";
my $ok = <$pipe>;
defined($ok) or $self->error("Failed to take over");
return;
}
=head2 $self->daemon_run
See L<App::Base::Daemon>
=cut
lib/App/Base/Daemon/Supervisor.pm view on Meta::CPAN
kill TERM => $pid;
waitpid $pid, 0;
exit 0;
};
$chld->close;
$par->autoflush(1);
$self->_supervisor_pipe($par);
while (local $_ = <$par>) {
chomp;
if ($_ eq 'ping') {
say $par 'pong';
} elsif ($_ eq 'takeover') {
$self->_control_takeover;
say $par 'ok';
} elsif ($_ eq 'shutdown') {
kill KILL => $pid;
close $par;
} else {
warn("Received unknown command from the supervised process: $_") unless $self->getOption('no-warn');
}
}
my $kid = waitpid $pid, 0;
warn("Supervised process $kid exited with status $?") unless $self->getOption('no-warn');
} elsif (not defined $pid) {
( run in 0.858 second using v1.01-cache-2.11-cpan-d7a12ab2c7f )