首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Perl system()、exec()和与LSF的交互

Perl system()、exec()和与LSF的交互
EN

Stack Overflow用户
提问于 2015-05-05 12:30:00
回答 1查看 456关注 0票数 0

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

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

现在,我准备在http://en.wikipedia.org/wiki/Platform_LSF (LSF)上运行这类工作对进程的400个迭代,但是我关心的是稳定性。我知道这些过程会崩溃。在这种情况下,我需要一个方法来知道进程何时崩溃,并杀死它的对进程和主脚本。

最初我写了一个看门狗,它有3分钟的监视时间,如果3分钟的不活动时间过去了,它就会杀死进程。然而,这捕获了许多假阳性,因为当LSF暂停两个进程之一时,看门狗认为它们是不活动的。

在LSF,当我发布工作,我可以选择杀死他们。然而,当我杀了一份工作,我到底要杀什么呢?会不会杀死Perl脚本创建的两个进程?还是让他们像僵尸一样跑?

重申一下,

  • 在LSF队列中杀死作业是否也会扼杀作业所创建的每个进程?
  • 最好的(最安全的)什么?如何从Perl脚本生成两个独立的进程,并等到其中一个进程退出才能继续?
  • 我如何编写一个能区分已崩溃进程和LSF管理员挂起的进程的看门狗?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-05-05 13:46:54

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

代码语言:javascript
复制
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
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30053001

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档