X-Git-Url: http://git.shadowcat.co.uk/gitweb/gitweb.cgi?a=blobdiff_plain;f=lib%2FMooseX%2FDaemonize.pm;h=52e6734f1c724f297bbacacb12a9200d675af3e3;hb=d8985b7d3e86e39f0f78636e58019504b805adac;hp=ffae57707438a5bcc09a6e94ae371a91ec582422;hpb=2eced27121e8557fe773f6f8804786f29f5660c1;p=gitmo%2FMooseX-Daemonize.git diff --git a/lib/MooseX/Daemonize.pm b/lib/MooseX/Daemonize.pm index ffae577..52e6734 100644 --- a/lib/MooseX/Daemonize.pm +++ b/lib/MooseX/Daemonize.pm @@ -1,16 +1,17 @@ package MooseX::Daemonize; use strict; # because Kwalitee is pedantic use Moose::Role; -use MooseX::Types::Path::Class; -use Moose::Util::TypeConstraints; -our $VERSION = 0.05; +use MooseX::Daemonize::Types; -use Carp 'carp'; -use Proc::Daemon; -use MooseX::Daemonize::PidFile; +our $VERSION = 0.05; -with qw(MooseX::Getopt); +with qw[ + MooseX::Daemonize::Core + MooseX::Daemonize::WithSignalHandling + MooseX::Daemonize::WithPidFile + MooseX::Getopt +]; has progname => ( isa => 'Str', @@ -23,46 +24,22 @@ has progname => ( }, ); -has basedir => ( +has pidbase => ( isa => 'Path::Class::Dir', is => 'ro', coerce => 1, - required => 1, + required => 1, lazy => 1, - default => sub { Path::Class::Dir->new('/') }, + default => sub { Path::Class::Dir->new('var', 'run') }, ); -has pidbase => ( +has basedir => ( isa => 'Path::Class::Dir', is => 'ro', coerce => 1, - required => 1, + required => 1, lazy => 1, - default => sub { Path::Class::Dir->new('var', 'run') }, -); - -coerce 'MooseX::Daemonize::PidFile' - => from 'Str' - => via { MooseX::Daemonize::PidFile->new( file => $_ ) }; - -has pidfile => ( - isa => 'MooseX::Daemonize::PidFile', - is => 'rw', - lazy => 1, - required => 1, - coerce => 1, - predicate => 'has_pidfile', - default => sub { - my $file = $_[0]->pidbase . '/' . $_[0]->progname . '.pid'; - confess "Cannot write to $file" unless (-e $file ? -w $file : -w $_[0]->pidbase); - MooseX::Daemonize::PidFile->new( file => $file ); - }, - handles => { - check => 'running', - save_pid => 'write', - remove_pid => 'remove', - get_pid => 'pid', - }, + default => sub { Path::Class::Dir->new('/') }, ); has foreground => ( @@ -73,29 +50,23 @@ has foreground => ( default => sub { 0 }, ); -has is_daemon => ( - isa => 'Bool', - is => 'rw', - default => sub { 0 }, -); - has stop_timeout => ( isa => 'Int', is => 'rw', default => sub { 2 } ); -sub daemonize { - my ($self) = @_; - return if Proc::Daemon::Fork; - Proc::Daemon::Init; - $self->is_daemon(1); +sub init_pidfile { + my $self = shift; + my $file = $self->pidbase . '/' . $self->progname . '.pid'; + confess "Cannot write to $file" unless (-e $file ? -w $file : -w $self->pidbase); + MooseX::Daemonize::Pid::File->new( file => $file ); } sub start { my ($self) = @_; - confess "instance already running" if $self->check; + confess "instance already running" if $self->pidfile->is_running; $self->daemonize unless $self->foreground; @@ -103,16 +74,10 @@ sub start { $self->pidfile->pid($$); - # Avoid 'stdin reopened for output' warning with newer perls - ## no critic - open( NULL, '/dev/null' ); - if (0); - ## use critic - # Change to basedir chdir $self->basedir; - $self->save_pid; + $self->pidfile->write; $self->setup_signals; return $$; } @@ -122,9 +87,9 @@ my $_kill; sub stop { my ( $self, %args ) = @_; - my $pid = $self->get_pid; + my $pid = $self->pidfile->pid; $self->$_kill($pid) unless $self->foreground(); - $self->remove_pid; + $self->pidfile->remove; return 1 if $args{no_exit}; exit; } @@ -135,10 +100,10 @@ sub restart { $self->start(); } -sub setup_signals { - my ($self) = @_; - $SIG{INT} = sub { $self->handle_sigint; }; - $SIG{HUP} = sub { $self->handle_sighup }; +sub handle_signal { + my ($self, $signal) = @_; + return $self->handle_sigint if $signal eq 'INT'; + return $self->handle_sighup if $signal eq 'HUP'; } sub handle_sigint { $_[0]->stop; } @@ -166,24 +131,24 @@ $_kill = sub { # Try SIGINT ... 2s ... SIGTERM ... 2s ... SIGKILL ... 3s ... UNDEAD! 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); + my ($signal, $timeout) = @$_; + $timeout = int $timeout; + + CORE::kill($signal, $pid); + last unless CORE::kill 0 => $pid or $!{EPERM}; - $timeout--; - } + + while ($timeout) { + sleep(1); + last unless CORE::kill 0 => $pid or $!{EPERM}; + $timeout--; + } } return unless ( CORE::kill 0 => $pid or $!{EPERM} ); # IF it is still running - carp "$pid doesn't seem to want to die."; # AHH EVIL DEAD! + Carp::carp "$pid doesn't seem to want to die."; # AHH EVIL DEAD! }; 1; @@ -237,7 +202,7 @@ The name of our daemon, defaults to $self->meta->name =~ s/::/_/; The base for our bid, defaults to /var/run/$progname -=item pidfile MooseX::Daemonize::PidFile | Str +=item pidfile MooseX::Daemonize::Pid::File | Str The file we store our PID in, defaults to /var/run/$progname @@ -262,10 +227,6 @@ it. Defaults to 2 seconds =over -=item check() - -Check to see if an instance is already running. - =item start() Setup a pidfile, fork, then setup the signal handlers. @@ -297,18 +258,6 @@ Handle a INT signal, by default calls C<$self->stop()> Handle a HUP signal. By default calls C<$self->restart()> -=item get_pid - -Lookup the pid from our pidfile. - -=item save_pid - -Save the current pid in our pidfile - -=item remove_pid - -Delete our pidfile - =item meta() The C method from L