我有一个脚本必须启动2个独立进程,并等到其中一个进程完成后再继续。
到目前为止,我通过使用if fork pid == 0, exec, else wait
创建一个流程来运行它。另一个是使用system
和命令行创建的。
现在我准备推出这个脚本,在Platform Load Sharing Facility(LSF)上运行400次迭代这样的工作对流程,但是我关注稳定性。我知道进程可能会崩溃。在这种情况下,我需要一种方法来了解进程何时崩溃,并终止其对进程和主脚本。
最初我写了一个监视器有3分钟的监视时间,如果3分钟的不活动通过,它会杀死进程。然而,这引起了很多误报,因为当LSF暂停其中一个进程时,监视程序将它们视为非活动状态。
在LSF中,当我发布作业时,我可以选择杀死它们。但是,当我杀了一份工作时,我究竟要杀了什么? kill会取消Perl脚本创建的两个进程吗?还是让他们像僵尸一样奔跑?
重申一下,
杀死LSF队列上的作业是否也会杀死作业创建的每个进程?
什么是最好的(最安全的?)方法从Perl脚本生成两个独立的进程,并等到其中一个进程退出才继续?
如何编写一个可以区分崩溃进程和LSF管理员暂停的进程的监视程序?
答案 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
}