App-Base
view release on metacpan or search on metacpan
lib/App/Base/Daemon.pm view on Meta::CPAN
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
Pid file name
=cut
has pid_file => (
is => 'ro',
lazy => 1,
builder => '_build_pid_file',
);
sub _build_pid_file {
my $self = shift;
my $file = $self->getOption('pid-file');
unless ($file) {
my $class = ref $self;
my $piddir = $ENV{APP_BASE_DAEMON_PIDDIR} || '/var/run';
$file = path($piddir)->child("$class.pid");
}
return "$file";
}
=head2 can_do_hot_reload
Should return true if implementation supports hot reloading
=cut
sub can_do_hot_reload { return }
around 'base_options' => sub {
my $orig = shift;
my $self = shift;
return [
@{$self->$orig},
{
name => 'no-fork',
documentation => "Do not detach and run in the background",
},
{
name => 'pid-file',
option_type => 'string',
documentation => "Use specified file to save PID",
},
{
name => 'no-pid-file',
documentation => "Do not check if pidfile exists and locked",
},
{
name => 'user',
documentation => "User to run as",
},
{
name => 'group',
documentation => "Group to run as",
},
{
name => 'no-warn',
documentation => 'Do not produce warnings',
},
];
};
=head1 METHODS
=cut
sub _signal_shutdown {
my $self = shift;
$self->handle_shutdown;
exit 0;
}
sub __run {
my $self = shift;
my $pid;
my $hot_reload = $ENV{APP_BASE_DAEMON_GEN}++ && $self->can_do_hot_reload;
unless ($self->getOption('no-pid-file') or $hot_reload) {
$pid = File::Flock::Tiny->trylock($self->pid_file);
unless ($pid) {
if ($self->can_do_hot_reload) {
chomp(my $pid = eval { my $fh = path($self->pid_file)->openr; <$fh>; });
if ($pid and kill USR2 => $pid) {
warn("Daemon is alredy running, initiated hot reload") unless $self->getOption('no-warn');
exit 0;
} else {
$self->error("Neither could lock pid file nor send USR2 to already running daemon.");
}
} else {
die("Couldn't lock " . $self->pid_file . ". Is another copy of this daemon already running?");
}
}
}
$SIG{PIPE} = 'IGNORE'; ## no critic (RequireLocalizedPunctuationVars)
foreach my $signal (@{$self->shutdown_signals}) {
$SIG{$signal} = sub { App::Base::Daemon::_signal_shutdown($self, @_) }; ## no critic (RequireLocalizedPunctuationVars)
( run in 2.116 seconds using v1.01-cache-2.11-cpan-f56aa216473 )