use Proc::Daemon;
use MooseX::Daemonize::PidFile;
-with qw(MooseX::Getopt);
+with qw[
+ MooseX::Daemonize::Core
+ MooseX::Daemonize::SignalHandling
+ MooseX::Getopt
+];
has progname => (
isa => 'Str',
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',
- },
);
has foreground => (
default => sub { 0 },
);
-has is_daemon => (
- isa => 'Bool',
- is => 'rw',
- default => sub { 0 },
-);
has stop_timeout => (
isa => 'Int',
default => sub { 2 }
);
-sub daemonize {
- my ($self) = @_;
- return if Proc::Daemon::Fork;
- Proc::Daemon::Init;
- $self->is_daemon(1);
-}
-
sub start {
my ($self) = @_;
- confess "instance already running" if $self->check;
+ confess "instance already running" if $self->pidfile->running;
$self->daemonize unless $self->foreground;
# Change to basedir
chdir $self->basedir;
- $self->save_pid;
+ $self->pidfile->write;
$self->setup_signals;
return $$;
}
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;
}
$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; }
# 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} );
=over
-=item check()
-
-Check to see if an instance is already running.
-
=item start()
Setup a pidfile, fork, then setup the signal handlers.
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<meta()> method from L<Class::MOP::Class>