调用其他几个脚本异步

时间:2015-06-27 20:04:54

标签: perl

我知道有很多方法可以做到这一点,但因为有这么多我不知道选择哪一个。

我想要完成的任务:
1.启动几个子脚本
2.能够检查他们是否正在运行 3.能够杀死他们 4.我不需要捕获它们的输出,也不需要显示它们的输出。

这些脚本中的每一个都在他们自己的文件中。

我有一段时间没有编写脚本,而且我陷入了OOP心态,如果我说一些荒谬的话,请原谅我。

2 个答案:

答案 0 :(得分:2)

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();

在循环之前添加以下内容将记录子项的PID。

$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是传递给$pm->start()的值。它可以用来给出一个名字"一个过程。

答案 1 :(得分:0)

Perl和parallel并不能很好地融合在一起,但这里有一些想法:

  • fork()几次,并独立管理每个孩子
  • Perl允许您打开文件句柄到进程:open my $fh, '-|', 'command_to_run.sh'。您可以使用它并轮询这些句柄
  • 将它们分到后台并存储其进程ID