如何在不使分叉进程超时的情况下杀死在perl脚本中花费太长时间的分叉进程? [英] How can I kill forked processes that take too long in my perl script without timing out the forked process?
问题描述
在并行处理事物"时,我一直在使用以下模板满足我的所有派生/过程需求.它基本上遍历了我需要处理的所有内容,一次X个条目,并且超时了所有花费太长时间的条目:
I've been using the following template for all of my forking/processes needs when it comes to processing "things" in parallel. It basically loops through everything I need to process, X number of entries at a time, and time's out any entries that take too long:
my $num_procs = 0;
foreach my $entry (@entries) {
$num_procs++;
if($num_procs == $MAX_PROCS) {
wait();
$num_procs--;
}
my $pid = fork();
if($pid == 0) {
process($entry);
}
}
for (; $num_procs>0; $num_procs--) {
wait();
}
流程"例程具有以下模板,该模板会使流程超时:
The "process" routine has the following template which times out the process:
my $TIMEOUT_IN_SECONDS = 15;
eval {
local $SIG{ALRM} = sub { die "alarm" };
alarm($TIMEOUT_IN_SECONDS);
# do something
alarm(0);
};
if ($@) {
# do something about the timeout
}
我现在遇到了一个问题,该问题不再起作用,因为孩子无法超时. (我认为这是由于NFS的I/O阻止问题引起的)我认为,解决此问题的唯一方法是让父母自己杀死-9个孩子.
I've now come across an issue where this no longer works because the child is unable to time itself out. (I think this is due to an I/O blocking issue with NFS) The only way around this, I'm thinking, is for the parent itself to kill -9 the child.
有没有办法修改我的代码来做到这一点?
Is there a way to modify my code to do this?