App-EventStreamr
view release on metacpan or search on metacpan
lib/App/EventStreamr/Roles/ProcessControl.pm view on Meta::CPAN
package App::EventStreamr::Roles::ProcessControl;
use v5.010;
use strict;
use warnings;
use Method::Signatures 20140224; # libmethod-signatures-perl
use Proc::Daemon; # libproc-daemon-perl
use Proc::ProcessTable; # libproc-processtable-perl
use Moo::Role; # libmoo-perl
# ABSTRACT: A process role
our $VERSION = '0.5'; # VERSION: Generated by DZP::OurPkg:Version
requires 'cmd','id';
has 'pid' => ( is => 'rw', lazy => 1, builder => 1, clearer => 'clear_pid' );
method _build_pid() {
my $pt = Proc::ProcessTable->new;
# Sometimes our processes report a different command than
# how they were started. Also they often spawn a new detached
# process, so we can't grab the pid from Proc::Daemon::Init.
my $regex = $self->cmd_regex ? $self->cmd_regex : $self->cmd;
my @procs = grep { $_->cmndline =~ /$regex/ } @{ $pt->table };
if (@procs) {
$self->info("Process ".$self->id." found with pid=".$procs[0]->pid);
return $procs[0]->pid;
} else {
return 0;
}
}
method start() {
my %proc_opts = ( exec_command => $self->cmd );
# Proc::Daemon will exit parent when started in Void
my $state = Proc::Daemon::Init( \%proc_opts );
}
method stop() {
if ($self->pid) {
kill 9, $self->pid;
$self->clear_pid;
return 1;
}
return 0;
}
method running() {
#TODO: pid 0 returns true. Should rework the logic here.
if ( ! $self->pid ) {
} elsif ( kill 0, $self->pid ) {
return 1;
}
$self->clear_pid;
return 0;
}
( run in 0.560 second using v1.01-cache-2.11-cpan-39bf76dae61 )