AnyEvent-Watchdog
view release on metacpan or search on metacpan
Watchdog.pm view on Meta::CPAN
use Carp ();
our $VERSION = '1.02';
our $PID; # child pid
our $ENABLED = 0; # also version
our $AUTORESTART; # actually exit
our ($P, $C);
sub poll($) {
(vec my $v, fileno $P, 1) = 1;
CORE::select $v, undef, undef, $_[0]
}
sub server {
my $expected;# do we expect a program exit?
my $heartbeat;
$AUTORESTART = 0;
Watchdog/Util.pm view on Meta::CPAN
AnyEvent::Watchdog::Util::enabled
or die "watchdog not enabled...";
AnyEvent::Watchdog::Util::restart;
Note that if it returns defined, but false, then AnyEvent::Watchdog is
running, but you are in the watchdog process - you probably did something
very wrong in this case.
=cut
sub enabled() {
$AnyEvent::Watchdog::ENABLED
}
=item AnyEvent::Watchdog::Util::restart_in [$timeout]
Tells the supervisor to restart the process when it exits (enable
autorestart), or forcefully after C<$timeout> seconds (minimum 1, maximum
255, default 60).
This function disables the heartbeat, if it was enabled. Also, after
calling this function the watchdog will ignore any further requests until
the program has restarted.
Good to call before you intend to exit, in case your clean-up handling
gets stuck.
=cut
sub restart_in(;$) {
my ($timeout) = @_;
return unless $C;
undef $HEARTBEAT_W;
$timeout = 60 unless defined $timeout;
$timeout = 1 if $timeout < 1;
$timeout = 255 if $timeout > 255;
Watchdog/Util.pm view on Meta::CPAN
our $OLD_C = $C; undef $C;
}
=item AnyEvent::Watchdog::Util::restart [$timeout]
Just like C<restart_in>, but also calls C<exit 0>. This means that this is
the ideal method to force a restart.
=cut
sub restart(;$) {
&restart_in;
exit 0;
}
=item AnyEvent::Watchdog::Util::autorestart [$boolean]
=item use AnyEvent::Watchdog autorestart => $boolean
Enables or disables autorestart (initially disabled, default for
C<$boolean> is to enable): By default, the supervisor will exit if the
program exits or dies in any way. When enabling autorestart behaviour,
then the supervisor will try to restart the program after it dies.
Note that the supervisor will never autorestart when the child died with
SIGINT or SIGTERM.
=cut
sub autorestart(;$) {
my $AUTORESTART = !@_ || $_[0];
return unless $C;
unless (enabled) {
warn "AnyEvent::Watchdog: watchdog not running, cannot enable autorestart, ignoring.\n"
if $AUTORESTART;
$AUTORESTART = 0;
Watchdog/Util.pm view on Meta::CPAN
twice as often.
Exit behaviour isn't changed, so if you want a restart instead of an exit,
you have to call C<autorestart>.
The heartbeat frequency can be changed as often as you want, an interval
of C<0> disables the heartbeat check again.
=cut
sub heartbeat(;$) {
my ($interval) = @_;
unless (enabled) {
warn "AnyEvent::Watchdog: watchdog not running, cannot enable heartbeat, ignoring.\n";
return;
}
$interval = 60 unless defined $interval;
$interval = 0 if $interval < 0;
$interval = 255 if $interval > 255;
Watchdog/Util.pm view on Meta::CPAN
# well, if we can't force it even now, try exit 255
$? = 255;
} else {
# exit status
$? = $EXIT_STATUS;
}
}
sub on_exit(&) {
unless ($AnyEvent::Watchdog::end) {
$AnyEvent::Watchdog::end = \&_exit;
push @ON_EXIT, $_[0];
for my $signal (qw(TERM INT XFSZ XCPU)) {
my $signum = AnyEvent::Base::sig2num $signal
or next;
$SIG_W{$signum} = AE::signal $signal => sub {
$EXIT_STATUS = [$signal => $signum];
( run in 0.628 second using v1.01-cache-2.11-cpan-65fba6d93b7 )