1 package MooseX::Daemonize;
2 use strict; # because Kwalitee is pedantic
12 with qw(MooseX::Getopt);
20 ( my $name = lc $_[0]->meta->name ) =~ s/::/_/g;
31 default => sub { return '/var/run' },
40 die 'Cannot write to ' . $_[0]->pidbase unless -w $_[0]->pidbase;
41 $_[0]->pidbase . '/' . $_[0]->progname . '.pid';
46 metaclass => 'Getopt',
55 if ( my $pid = $self->get_pid ) {
56 my $prog = $self->progname;
57 if ( CORE::kill 0 => $pid ) {
58 croak "$prog already running ($pid).";
60 carp "$prog not running but found pid ($pid)."
61 . "Perhaps the pid file (@{ [$self->pidfile] }) is stale?";
74 return if $self->check;
76 $self->daemonize unless $self->foreground;
78 # Avoid 'stdin reopened for output' warning with newer perls
79 open( NULL, '/dev/null' );
89 my $pidfile = $self->pidfile;
90 lock( $pidfile, undef, 'nonblocking' )
91 or croak "Could not lock PID file $pidfile: $!";
92 write_file( $pidfile, "$$\n" );
99 my $pidfile = $self->pidfile;
100 lock( $pidfile, undef, 'nonblocking' )
101 or croak "Could not lock PID file $pidfile: $!";
109 my $pidfile = $self->pidfile;
110 return unless -e $pidfile;
111 chomp( my $pid = read_file($pidfile) );
116 my ( $self, %args ) = @_;
117 my $pid = $self->get_pid;
118 $self->kill($pid) unless $self->foreground();
120 return 1 if $args{no_exit};
126 $self->stop( noexit => 1 );
132 $SIG{INT} = sub { $self->handle_sigint; };
133 $SIG{HUP} = sub { $self->handle_sighup };
136 sub handle_sigint { $_[0]->stop; }
137 sub handle_sighup { $_[0]->restart; }
140 my ( $self, $pid ) = @_;
142 unless ( CORE::kill 0 => $pid ) {
144 # warn "$pid already appears dead.";
150 # warn "$pid is us! Can't commit suicied.";
154 CORE::kill( 2, $pid ); # Try SIGINT
155 sleep(2) if CORE::kill( 0, $pid );
157 unless ( CORE::kill 0 => $pid or $!{EPERM} ) { # IF it is still running
158 CORE::kill( 15, $pid ); # try SIGTERM
159 sleep(2) if CORE::kill( 0, $pid );
162 unless ( CORE::kill 0 => $pid or $!{EPERM} ) { # IF it is still running
163 CORE::kill( 9, $pid ); # finally try SIGKILL
164 sleep(2) if CORE::kill( 0, $pid );
167 unless ( CORE::kill 0 => $pid or $!{EPERM} ) { # IF it is still running
168 carp "$pid doesn't seem to want to die."; # AHH EVIL DEAD!
179 MooseX::Daemonize - provides a Role that daemonizes your Moose based application.
184 This document describes MooseX::Daemonize version 0.0.1
191 with qw(MooseX::Daemonize);
194 my ( $self, $file ) = @_;
195 open( FILE, ">$file" ) || die;
201 # then in the main package ...
203 my $daemon = FileMaker->new();
205 $daemon->create_file($file);
210 Often you want to write a persistant daemon that has a pid file, and responds appropriately to Signals.
211 This module helps provide the basic infrastructure to do that.
219 The name of our daemon, defaults to $0
223 The base for our bid, defaults to /var/run/$progname
227 The file we store our PID in, defaults to /var/run/$progname/
229 =item foreground Bool
231 If true, the process won't background. Useful for debugging. This option can be set via Getopt's -f.
241 Check to see if an instance is already running.
245 Setup a pidfile, fork, then setup the signal handlers.
249 Stop the process matching the pidfile, and unlinks the pidfile.
260 Calls C<Proc::Daemon::Init> to daemonize this process.
264 Kills the process for $pid. This will try SIGINT, and SIGTERM before falling back to SIGKILL and finally giving up.
266 =item setup_signals()
268 Setup the signal handlers, by default it only sets up handlers for SIGINT and SIGHUP
270 =item handle_sigint()
272 Handle a INT signal, by default calls C<$self->stop()>;
274 =item handle_sighup()
276 Handle a HUP signal. Nothing is done by default.
286 the C<meta()> method from L<Class::MOP::Class>
292 =for author to fill in:
293 A list of all the other modules that this module relies upon,
294 including any restrictions on versions, and an indication whether
295 the module is part of the standard Perl distribution, part of the
296 module's distribution, or must be installed separately. ]
298 Obviously L<Moose>, also L<Carp>, L<Proc::Daemon>, L<File::Flock>, L<File::Slurp>
300 =head1 INCOMPATIBILITIES
302 =for author to fill in:
303 A list of any modules that this module cannot be used in conjunction
304 with. This may be due to name conflicts in the interface, or
305 competition for system or program resources, or due to internal
306 limitations of Perl (for example, many modules that use source code
307 filters are mutually incompatible).
312 =head1 BUGS AND LIMITATIONS
314 =for author to fill in:
315 A list of known problems with the module, together with some
316 indication Whether they are likely to be fixed in an upcoming
317 release. Also a list of restrictions on the features the module
318 does provide: data types that cannot be handled, performance issues
319 and the circumstances in which they may arise, practical
320 limitations on the size of data sets, special cases that are not
323 No bugs have been reported.
325 Please report any bugs or feature requests to
326 C<bug-acme-dahut-call@rt.cpan.org>, or through the web interface at
327 L<http://rt.cpan.org>.
331 L<Proc::Daemon>, L<Daemon::Generic>, L<MooseX::Getopt>
335 Chris Prather C<< <perigrin@cpan.org> >>
338 =head1 LICENCE AND COPYRIGHT
340 Copyright (c) 2007, Chris Prather C<< <perigrin@cpan.org> >>. All rights reserved.
342 This module is free software; you can redistribute it and/or
343 modify it under the same terms as Perl itself. See L<perlartistic>.
346 =head1 DISCLAIMER OF WARRANTY
348 BECAUSE THIS SOFTWARE IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
349 FOR THE SOFTWARE, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN
350 OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
351 PROVIDE THE SOFTWARE "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER
352 EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
353 WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE
354 ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE SOFTWARE IS WITH
355 YOU. SHOULD THE SOFTWARE PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL
356 NECESSARY SERVICING, REPAIR, OR CORRECTION.
358 IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
359 WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
360 REDISTRIBUTE THE SOFTWARE AS PERMITTED BY THE ABOVE LICENCE, BE
361 LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL,
362 OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE
363 THE SOFTWARE (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
364 RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
365 FAILURE OF THE SOFTWARE TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
366 SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF