X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FDaemonize.pm;h=875a05bf2767d149d0b89ecdf1fc806ae0254751;hb=69186a4879a2ddfed228c03e7a25d5455921dfb0;hp=dc6be99691cdca0b86c9e688db9330f283c8badc;hpb=892a51e60bd3417ab7c22b4c2c6b2e80b6b0e415;p=gitmo%2FMooseX-Daemonize.git diff --git a/lib/MooseX/Daemonize.pm b/lib/MooseX/Daemonize.pm index dc6be99..875a05b 100644 --- a/lib/MooseX/Daemonize.pm +++ b/lib/MooseX/Daemonize.pm @@ -3,13 +3,13 @@ use strict; # because Kwalitee is pedantic use Moose::Role; use MooseX::Types::Path::Class; -our $VERSION = 0.05; +our $VERSION = "0.09"; with 'MooseX::Daemonize::WithPidFile', 'MooseX::Getopt'; -use constant OK => 0; -use constant ERROR => 1; +sub OK () { 0 } +sub ERROR () { 1 } has progname => ( metaclass => 'Getopt', @@ -30,7 +30,7 @@ has pidbase => ( coerce => 1, required => 1, lazy => 1, - default => sub { Path::Class::Dir->new('var', 'run') }, + default => sub { Path::Class::Dir->new('', 'var', 'run') }, ); has basedir => ( @@ -115,7 +115,7 @@ sub start { $self->clear_exit_code; if ($self->pidfile->is_running) { - $self->exit_code(OK); + $self->exit_code($self->OK); $self->status_message('Daemon is already running with pid (' . $self->pidfile->pid . ')'); return !($self->exit_code); } @@ -126,14 +126,14 @@ sub start { else { eval { $self->daemonize }; if ($@) { - $self->exit_code(ERROR); + $self->exit_code($self->ERROR); $self->status_message('Start failed : ' . $@); return !($self->exit_code); } } unless ($self->is_daemon) { - $self->exit_code(OK); + $self->exit_code($self->OK); $self->status_message('Start succeeded'); return !($self->exit_code); } @@ -155,11 +155,11 @@ sub status { $self->clear_exit_code; if ($self->pidfile->is_running) { - $self->exit_code(OK); + $self->exit_code($self->OK); $self->status_message('Daemon is running with pid (' . $self->pidfile->pid . ')'); } else { - $self->exit_code(ERROR); + $self->exit_code($self->ERROR); $self->status_message('Daemon is not running with pid (' . $self->pidfile->pid . ')'); } @@ -173,17 +173,17 @@ sub restart { $self->clear_exit_code; unless ($self->stop) { - $self->exit_code(ERROR); + $self->exit_code($self->ERROR); $self->status_message('Restart (Stop) failed : ' . $@); } unless ($self->start) { - $self->exit_code(ERROR); + $self->exit_code($self->ERROR); $self->status_message('Restart (Start) failed : ' . $@); } - if ($self->exit_code == OK) { - $self->exit_code(OK); + if ($self->exit_code == $self->OK) { + $self->exit_code($self->OK); $self->status_message("Restart successful"); } @@ -213,31 +213,22 @@ sub stop { eval { $self->$_kill($self->pidfile->pid) }; # and complain if we can't ... if ($@) { - $self->exit_code(ERROR); + $self->exit_code($self->ERROR); $self->status_message('Stop failed : ' . $@); } # or gloat if we succeed .. else { - $self->exit_code(OK); + $self->exit_code($self->OK); $self->status_message('Stop succeeded'); } } - - # clean up ... - eval { $self->pidfile->remove }; - if ($@) { - warn "Could not remove pidfile (" - . $self->pidfile->file - . ") because : $!"; - } - } else { # this just returns the OK # exit code for now, but # we should make this overridable - $self->exit_code(OK); + $self->exit_code($self->OK); $self->status_message("Not running"); } @@ -265,22 +256,38 @@ $_kill = sub { # $!{EPERM} could also be true if we cant kill it (permission error) # Try SIGINT ... 2s ... SIGTERM ... 2s ... SIGKILL ... 3s ... UNDEAD! + my $terminating_signal; for ( [ 2, $timeout ], [15, $timeout], [9, $timeout * 1.5] ) { my ($signal, $timeout) = @$_; $timeout = int $timeout; CORE::kill($signal, $pid); - last unless CORE::kill 0 => $pid or $!{EPERM}; - while ($timeout) { - sleep(1); - last unless CORE::kill 0 => $pid or $!{EPERM}; + unless(CORE::kill 0 => $pid or $!{EPERM}) { + $terminating_signal = $signal; + last; + } $timeout--; + sleep(1) if $timeout; } + + last if $terminating_signal; } - return unless ( CORE::kill 0 => $pid or $!{EPERM} ); + if($terminating_signal) { + if($terminating_signal == 9) { + # clean up the pidfile ourselves iff we used -9 and it worked + warn "Had to resort to 'kill -9' and it worked, wiping pidfile"; + eval { $self->pidfile->remove }; + if ($@) { + warn "Could not remove pidfile (" + . $self->pidfile->file + . ") because : $!"; + } + } + return; + } # IF it is still running Carp::carp "$pid doesn't seem to want to die."; # AHH EVIL DEAD! @@ -469,6 +476,22 @@ Handle a HUP signal. By default calls C<$self->restart()> =back +=head2 Exit Code Methods + +These are overriable constant methods used for setting the exit code. + +=over 4 + +=item OK + +Returns 0. + +=item ERROR + +Returns 1. + +=back + =head2 Introspection =over 4 @@ -501,7 +524,7 @@ L, L =head1 AUTHORS -Chris Prather C<< >> +Chris Prather C<< > Stevan Little C<< >> @@ -514,7 +537,7 @@ Some bug fixes sponsored by Takkle Inc. =head1 LICENCE AND COPYRIGHT -Copyright (c) 2007, Chris Prather C<< >>. All rights +Copyright (c) 2007-2009, Chris Prather C<< >>. Some rights reserved. This module is free software; you can redistribute it and/or