change signal names to numbers as that is more portable and perl's
[gitmo/MooseX-Daemonize.git] / lib / MooseX / Daemonize.pm
index 8e87a0d..07a0d9a 100644 (file)
@@ -3,13 +3,13 @@ use strict;    # because Kwalitee is pedantic
 use Moose::Role;
 use MooseX::Types::Path::Class;
 
-our $VERSION = 0.06;
+our $VERSION   = '0.14';
 
 with 'MooseX::Daemonize::WithPidFile',
      'MooseX::Getopt';
-     
-use constant OK    => 0;
-use constant ERROR => 1;
+
+sub OK    () { 0 }
+sub ERROR () { 1 }
 
 has progname => (
     metaclass => 'Getopt',
@@ -116,15 +116,15 @@ sub start {
 
     if ($self->pidfile->is_running) {
         $self->exit_code($self->OK);
-        $self->status_message('Daemon is already running with pid (' . $self->pidfile->pid . ')');        
+        $self->status_message('Daemon is already running with pid (' . $self->pidfile->pid . ')');
         return !($self->exit_code);
     }
-    
-    if ($self->foreground) { 
+
+    if ($self->foreground) {
         $self->is_daemon(1);
     }
-    else {      
-        eval { $self->daemonize };              
+    else {
+        eval { $self->daemonize };
         if ($@) {
             $self->exit_code($self->ERROR);
             $self->status_message('Start failed : ' . $@);
@@ -133,7 +133,7 @@ sub start {
     }
 
     unless ($self->is_daemon) {
-        $self->exit_code($self->OK);        
+        $self->exit_code($self->OK);
         $self->status_message('Start succeeded');
         return !($self->exit_code);
     }
@@ -155,10 +155,10 @@ sub status {
     $self->clear_exit_code;
 
     if ($self->pidfile->is_running) {
-        $self->exit_code($self->OK);        
-        $self->status_message('Daemon is running with pid (' . $self->pidfile->pid . ')');    
+        $self->exit_code($self->OK);
+        $self->status_message('Daemon is running with pid (' . $self->pidfile->pid . ')');
     }
-    else {            
+    else {
         $self->exit_code($self->ERROR);
         $self->status_message('Daemon is not running with pid (' . $self->pidfile->pid . ')');
     }
@@ -228,7 +228,7 @@ sub stop {
         # this just returns the OK
         # exit code for now, but
         # we should make this overridable
-        $self->exit_code($self->OK);        
+        $self->exit_code($self->OK);
         $self->status_message("Not running");
     }
 
@@ -257,7 +257,7 @@ $_kill = sub {
 
     # Try SIGINT ... 2s ... SIGTERM ... 2s ... SIGKILL ... 3s ... UNDEAD!
     my $terminating_signal;
-    for ( [ 2, $timeout ], [15, $timeout], [9, $timeout * 1.5] ) {
+    for ( [ 'INT', $timeout ], ['TERM', $timeout], ['KILL', $timeout * 1.5] ) {
         my ($signal, $timeout) = @$_;
         $timeout = int $timeout;
 
@@ -276,9 +276,9 @@ $_kill = sub {
     }
 
     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";
+        if($terminating_signal eq 'KILL') {
+            # clean up the pidfile ourselves iff we used KILL and it worked
+            warn "Had to resort to 'kill -KILL' and it worked, wiping pidfile";
             eval { $self->pidfile->remove };
             if ($@) {
                 warn "Could not remove pidfile ("
@@ -342,6 +342,28 @@ Often you want to write a persistant daemon that has a pid file, and responds
 appropriately to Signals. This module provides a set of basic roles as an
 infrastructure to do that.
 
+=head1 CAVEATS
+
+When going into background MooseX::Daemonize closes all open file
+handles. This may interfere with you logging because it may also close the log
+file handle you want to write to. To prevent this you can either defer opening
+the log file until after start. Alternatively, use can use the
+'dont_close_all_files' option either from the command line or in your .sh
+script.
+
+Assuming you want to use Log::Log4perl for example you could expand the
+MooseX::Daemonize example above like this.
+
+    after start => sub {
+        my $self = shift;
+        return unless $self->is_daemon;
+        Log::Log4perl->init(\$log4perl_config);
+        my $logger = Log::Log4perl->get_logger();
+        $logger->info("Daemon started");
+        # your daemon code here ...
+    };
+
+
 =head1 ATTRIBUTES
 
 This list includes attributes brought in from other roles as well
@@ -357,17 +379,34 @@ The name of our daemon, defaults to C<$package_name =~ s/::/_/>;
 
 =item I<pidbase Path::Class::Dir | Str>
 
-The base for our bid, defaults to C</var/run/$progname>
+The base for our PID, defaults to C</var/run/>
 
 =item I<pidfile MooseX::Daemonize::Pid::File | Str>
 
-The file we store our PID in, defaults to C</var/run/$progname>
+The file we store our PID in, defaults to C<$pidbase/$progname.pid>
 
 =item I<foreground Bool>
 
 If true, the process won't background. Useful for debugging. This option can
 be set via Getopt's -f.
 
+=item I<no_double_fork Bool>
+
+If true, the process will not perform the typical double-fork, which is extra
+added protection from your process accidentally aquiring a controlling terminal.
+More information can be found by Googling "double fork daemonize".
+
+=item I<ignore_zombies Bool>
+
+If true, the process will not clean up zombie processes.
+Normally you don't want this.
+
+=item I<dont_close_all_files Bool>
+
+If true, the objects open filehandles will not be closed when daemonized.
+Normally you don't want this.
+
+
 =item I<is_daemon Bool>
 
 If true, the process is the backgrounded daemon process, if false it is the
@@ -524,7 +563,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> >>
 
@@ -537,7 +576,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-2011, Chris Prather C<< <chris@prather.org> >>. Some rights
 reserved.
 
 This module is free software; you can redistribute it and/or