clean stuff up for a 0.09 release
[gitmo/MooseX-Daemonize.git] / lib / MooseX / Daemonize.pm
index dc6be99..875a05b 100644 (file)
@@ -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<Proc::Daemon>, L<Daemon::Generic>
 
 =head1 AUTHORS
 
-Chris Prather  C<< <perigrin@cpan.org> >>
+Chris Prather  C<< <chris@prather.org >>
 
 Stevan Little  C<< <stevan.little@iinteractive.com> >>
 
@@ -514,7 +537,7 @@ Some bug fixes sponsored by Takkle Inc.
 
 =head1 LICENCE AND COPYRIGHT
 
-Copyright (c) 2007, Chris Prather C<< <perigrin@cpan.org> >>. All rights
+Copyright (c) 2007-2009, Chris Prather C<< <chris@prather.org> >>. Some rights
 reserved.
 
 This module is free software; you can redistribute it and/or