App-Base
view release on metacpan or search on metacpan
lib/App/Base/Daemon.pm view on Meta::CPAN
}
return 0; # This will never be reached
}
sub handle_shutdown {
my $self = shift;
# do something
return 0;
}
no Moose;
__PACKAGE__->meta->make_immutable;
1;
exit App::Base::Daemon::example->new->run;
=head1 DESCRIPTION
App::Base::Daemon builds on App::Base::Script::Common and provides common infrastructure for writing daemons, including:
=over 4
=item -
Standardized logging techniques via syslog
=item -
Signal processing and graceful shutdown
=back
=head1 BUILT-IN OPTIONS
Every App::Base::Daemon-implementing class gets some daemon-specific options for
free, in addition to those provided by App::Base::Script::Common. They are:
=head2 --no-fork
Rather than double-forking and detaching from the console, the daemon
runs in the foreground (parent) process. Useful for debugging or
interactive invocations.
=head2 --pid-file
Writes PID of the daemon into specified file, by default writes pid into /var/run/__PACKAGE__.pid
=head2 --no-pid-file
Do not write pid file, and do not check if it is exist and locked.
=head2 --no-warn
Do not produce warnings, silent mode
=head1 REQUIRED SUBCLASS METHODS
=cut
use namespace::autoclean;
use Syntax::Keyword::Try;
use Path::Tiny;
=head2 daemon_run
The main loop that runs the daemon. Typically this will include while(1) or
something similar. If this method returns, daemon exits.
=cut
requires 'daemon_run';
=head2 handle_shutdown
Called before the daemon shuts down in response to a shutdown signal. Should
clean up any resources in use by the daemon. The return value of
handle_shutdown is used as the exit status of the daemon.
=cut
requires 'handle_shutdown';
use Socket;
use IO::Handle;
use File::Flock::Tiny;
use POSIX qw();
=head1 ATTRIBUTES
=head2 shutdown_signals
An arrayref of signals that should result in termination of the daemon.
Defaults are: INT, QUIT, TERM.
=cut
has 'shutdown_signals' => (
is => 'ro',
default => sub {
[qw( INT QUIT TERM )];
},
);
=head2 user
Run as specified user, note that it is only possible if daemon started as root
=cut
has user => (is => 'ro');
=head2 group
Run as specified group, note that it is only possible if daemon started as root
=cut
has group => (is => 'ro');
=head2 pid_file
( run in 0.949 second using v1.01-cache-2.11-cpan-39bf76dae61 )