如何在不使分叉进程超时的情况下杀死在perl脚本中花费太长时间的分叉进程? [英] How can I kill forked processes that take too long in my perl script without timing out the forked process?

查看:117
本文介绍了如何在不使分叉进程超时的情况下杀死在perl脚本中花费太长时间的分叉进程?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在并行处理事物"时,我一直在使用以下模板满足我的所有派生/过程需求.它基本上遍历了我需要处理的所有内容,一次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?

推荐答案

只要alarm容易出错,对于

第一个fork启动您的子进程.第二个fork用于运行一个进程,以在$time秒后杀死第一个进程.

The first fork fires off your child process. The second fork is for running a process to kill the first process after $time seconds.

这篇关于如何在不使分叉进程超时的情况下杀死在perl脚本中花费太长时间的分叉进程?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆