Perl system(),exec()和与LSF的交互

时间:2015-05-05 12:30:00

标签: linux perl lsf

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

到目前为止,我通过使用if fork pid == 0, exec, else wait创建一个流程来运行它。另一个是使用system和命令行创建的。

现在我准备推出这个脚本,在Platform Load Sharing Facility(LSF)上运行400次迭代这样的工作对流程,但是我关注稳定性。我知道进程可能会崩溃。在这种情况下,我需要一种方法来了解进程何时崩溃,并终止其对进程和主脚本。

最初我写了一个监视器有3分钟的监视时间,如果3分钟的不活动通过,它会杀死进程。然而,这引起了很多误报,因为当LSF暂停其中一个进程时,监视程序将它们视为非活动状态。

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

重申一下,

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

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

  • 如何编写一个可以区分崩溃进程和LSF管理员暂停的进程的监视程序?

1 个答案:

答案 0 :(得分: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
}