Perl system()、exec() 和与 LSF 的交互
Perl system(), exec() and interactions with LSF
我有一个脚本必须启动 2 个独立的进程,并等到其中一个完成后再继续。
到目前为止,我已经 运行 通过创建一个带有 if fork pid == 0, exec, else wait
的进程来实现它。另一个是使用 system
和命令行创建的。
现在我正准备在 Platform Load Sharing Facility (LSF) 上将此脚本推广到 运行 400 次此类工作对流程迭代,但我担心稳定性。我知道进程可能会崩溃。在这种情况下,我需要一种方法来知道进程何时崩溃,并杀死它的配对进程和主脚本。
最初我写了一个监视周期为 3 分钟的看门狗,如果超过 3 分钟不活动,它会终止进程。然而,这引起了很多误报,因为当 LSF 暂停两个进程之一时,看门狗将它们视为不活动的。
在 LSF 中,当我发布作业时,我可以选择终止它们。然而,当我扼杀一份工作时,我究竟扼杀了什么? kill 是否会取消 Perl 脚本创建的两个进程?还是让他们 运行ning 变成僵尸?
重申一下,
终止 LSF 队列上的作业是否也会终止该作业创建的所有进程?
从 Perl 脚本生成两个独立进程并等待其中一个进程退出再继续的最佳(最安全?)方法是什么?
我如何编写一个看门狗来区分崩溃的进程和被 LSF 管理员挂起的进程?
监视器应该是创建子进程的监视器。 (它也可以启动 "main script"。)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
}
我有一个脚本必须启动 2 个独立的进程,并等到其中一个完成后再继续。
到目前为止,我已经 运行 通过创建一个带有 if fork pid == 0, exec, else wait
的进程来实现它。另一个是使用 system
和命令行创建的。
现在我正准备在 Platform Load Sharing Facility (LSF) 上将此脚本推广到 运行 400 次此类工作对流程迭代,但我担心稳定性。我知道进程可能会崩溃。在这种情况下,我需要一种方法来知道进程何时崩溃,并杀死它的配对进程和主脚本。
最初我写了一个监视周期为 3 分钟的看门狗,如果超过 3 分钟不活动,它会终止进程。然而,这引起了很多误报,因为当 LSF 暂停两个进程之一时,看门狗将它们视为不活动的。
在 LSF 中,当我发布作业时,我可以选择终止它们。然而,当我扼杀一份工作时,我究竟扼杀了什么? kill 是否会取消 Perl 脚本创建的两个进程?还是让他们 运行ning 变成僵尸?
重申一下,
终止 LSF 队列上的作业是否也会终止该作业创建的所有进程?
从 Perl 脚本生成两个独立进程并等待其中一个进程退出再继续的最佳(最安全?)方法是什么?
我如何编写一个看门狗来区分崩溃的进程和被 LSF 管理员挂起的进程?
监视器应该是创建子进程的监视器。 (它也可以启动 "main script"。)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
}