Rogue
Rogue

Reputation: 676

Call Several Other Scripts Async

I know there a lot of ways to do this, but because there are so many I don't know which one to choose.

What I want to accomplish:
1. Start several child scripts
2. Be able to check if they are running
3. Be able to kill them
4. I DON'T need to capture their output, and their output does not need to be displayed.

Each of these scripts is in their own file.

I haven't done scripting in a while and I'm stuck in an OOP mindset, so forgive me if I say something ridiculous.

Upvotes: 0

Views: 54

Answers (2)

ikegami
ikegami

Reputation: 385546

use Parallel::ForkManager qw( );

use constant MAX_SIMUL_CHILDREN => 10;

my $pm = Parallel::ForkManager->new(MAX_SIMUL_CHILDREN);
for my $cmd (@cmds) {
   $pm->start()
      and next;

   open(STDOUT, '>', '/dev/null')
      or die($!);

   exec($cmd)
      or die($!);

   $pm->finish();  # Never reached, but that's ok.
}

$pm->wait_all_children();

Adding the following before the loop will log the PID of the children.

$pm->run_on_start(sub {
   my ($pid, $ident) = @_;
   print("Child $pid started.\n");
});

$pm->run_on_finish(sub {
   my ($pid, $exit_code, $ident, $exit_signal) = @_;
   if ($exit_signal)  { print("Child $pid killed by signal $exit_signal.\n"); }
   elsif ($exit_code) { print("Child $pid exited with error $exit_code.\n"); }
   else               { print("Child $pid completed successfully.\n"); }
});

$ident is the value passed to $pm->start(). It can be used to give a "name" to a process.

Upvotes: 2

Tom van der Woerdt
Tom van der Woerdt

Reputation: 29965

Perl and parallel don't go well together, but here are a few thoughts :

  • fork() a few times, and manage each child independently
  • Perl allows you to open filehandles to processes: open my $fh, '-|', 'command_to_run.sh'. You could use this and poll those handles
  • Fork them to the background and store their process IDs

Upvotes: 0

Related Questions