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 )