0

我有一个脚本必须启动 2 个独立的进程,并等到其中一个进程完成后再继续。

到目前为止,我已经通过使用if fork pid == 0, exec, else wait. 另一个是使用system命令行创建的。

现在我准备推出这个脚本以在平台负载共享设施(LSF) 上运行 400 次此类工作对流程的迭代,但我担心稳定性。我知道进程可能会崩溃。在这种情况下,我需要一种方法来了解进程何时崩溃,并终止其配对进程和主脚本。

最初我写了一个监视周期为 3 分钟的看门狗,如果 3 分钟不活动通过,它会杀死进程。然而,这引起了很多误报,因为当 LSF 暂停两个进程之一时,看门狗将它们视为不活动的。

在 LSF 中,当我发布作业时,我可以选择杀死它们。但是,当我杀死一个工作时,我到底要杀死什么?kill 会取消 Perl 脚本创建的两个进程吗?还是让他们像僵尸一样奔跑?

重申一下,

  • 杀死 LSF 队列上的作业也会杀死该作业创建的每个进程吗?

  • 从 Perl 脚本生成两个独立进程并等待其中一个进程退出再继续的最佳(最安全?)方法是什么?

  • 我如何编写一个看门狗来区分进程已经崩溃和被 LSF 管理员挂起的进程?

4

1 回答 1

2

监视器是应该创建子进程的监视器。(它也可以启动“主脚本”。)wait当它们崩溃时会告诉你。

my %children;

my $pid1 = fork();
if (!defined($pid1)) { ... }
if ($pid1) { ... }
++$children{$pid1};

my $pid2 = fork();
if (!defined($pid2)) { ... }
if ($pid2) { ... }
++$children{$pid2};

while (keys(%children)) {
   my $pid = wait();
   next if !$children{$pid};  # !!!

   delete($children{$pid});

   if ($? & 0x7F) { ... }   # Killed from signal
   if ($? >> 8) { ... }     # Returned an error
}
于 2015-05-05T13:46:54.413 回答