Linux Perl system()、exec()以及与LSF的交互
我有一个脚本,必须启动两个独立的进程,并等待其中一个进程完成后才能继续 到目前为止,我已经通过创建一个进程来运行它,如果fork pid==0,exec,else wait。另一个是使用Linux Perl system()、exec()以及与LSF的交互,linux,perl,lsf,Linux,Perl,Lsf,我有一个脚本,必须启动两个独立的进程,并等待其中一个进程完成后才能继续 到目前为止,我已经通过创建一个进程来运行它,如果fork pid==0,exec,else wait。另一个是使用system和命令行创建的 现在我准备推出这个脚本,在(LSF)上运行400次这样的工作对过程迭代,不过我关心的是稳定性。我知道这些过程可能会崩溃。在这种情况下,我需要一个方法来知道进程何时崩溃,并杀死它的成对进程和主脚本 最初,我编写了一个有3分钟观察周期的看门狗,如果3分钟的不活动时间过去了,它就会终止进程。
system
和命令行创建的
现在我准备推出这个脚本,在(LSF)上运行400次这样的工作对过程迭代,不过我关心的是稳定性。我知道这些过程可能会崩溃。在这种情况下,我需要一个方法来知道进程何时崩溃,并杀死它的成对进程和主脚本
最初,我编写了一个有3分钟观察周期的看门狗,如果3分钟的不活动时间过去了,它就会终止进程。然而,这捕获了很多误报,因为当LSF暂停两个进程中的一个时,看门狗将它们视为不活动的
在LSF中,当我发布作业时,我可以选择杀死它们。然而,当我杀死一份工作时,我到底要杀死什么?kill是否会删除Perl脚本创建的两个进程?还是让他们变成僵尸
重申,
- 终止LSF队列上的作业是否也会终止该作业创建的每个进程
- 从Perl脚本生成两个独立进程并等待其中一个进程退出再继续的最佳(最安全的)方法是什么
- 如何编写一个看门狗来区分崩溃的进程和LSF管理员挂起的进程
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
}
LSF如何暂停/恢复?我想这是通过
SIGSTOP
和SIGCONT
?“默认操作是向作业发送以下信号:SIGTSTP用于并行或交互式作业。SIGTSTP被主进程捕获并传递给其他主机上运行的所有从进程。SIGSTOP用于顺序作业。SIGSTOP无法被用户程序捕获。可以使用lsf.conf中的LSB_SIGSTOP参数从lsf的“作业控制”配置SIGSTOP信号。我想知道“从进程”的含义是什么“在这种情况下,指的是由原始作业生成的流程,那么您的想法是重组脚本?因此,您有一个脚本调用主脚本,并且还创建了两个子进程,它使用wait on来捕获返回值,并查看它是错误还是被信号杀死?是的。主脚本可以继承到子脚本的管道。此外,您可能不知道setsid(2)
(可通过POSIX::setsid()
获得)。创建一个可以向其发送信号的进程组。非常感谢,这看起来是向前推进的最佳方式!