2013-04-05 14 views
1

我一直在使用以下模板來處理並行處理「事物」的所有分支/進程需求。它主要通過一切我需要處理,在時間條目的X個循環和時間的任何條目需要太長時間:我怎樣才能殺死在我的Perl腳本中花費太長時間的分叉進程而不超時分叉進程?

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(); 
} 

「過程」例行具有以下模板,超時過程:

my $TIMEOUT_IN_SECONDS = 15; 
eval { 
    local $SIG{ALRM} = sub { die "alarm" }; 
    alarm($TIMEOUT_IN_SECONDS);  

    # do something 

    alarm(0); 
}; 
if ([email protected]) { 
    # do something about the timeout 
} 

我現在遇到了一個問題,因爲這個孩子不能工作,因爲這個孩子不能工作。 (我認爲這是由於NFS的I/O阻塞問題)我想,解決這個問題的唯一方法是讓父母自己殺死孩子。

有沒有辦法修改我的代碼來做到這一點?

+0

看到這個S.O.問題[這裏](http://stackoverflow.com/questions/15012289/perl-fork-and-kill-kill0-pid-always-returns-1-and-cant-kill-the-child/15013244#15013244)。這應該給你足夠多的自己去實現這個。 – chrsblck 2013-04-05 19:35:23

+0

可能重複[如何從Windows上的Perl CGI腳本分叉後臺進程?](http://stackoverflow.com/questions/45792/how-can-i-fork-a-background-processes-from- A-Perl的CGI腳本式窗口) – 2013-04-05 19:37:00

回答

2

每當alarm可呈片狀,這是一個很好的用例the poor man's alarm

my $pid = fork(); 
if ($pid == 0) { 
    ... # child code 
    exit; 
} 
if (fork() == 0) { 
    my $time = 15; 
    exec($^X, "-e", "sleep 1,kill(0,$pid)||exit for 1..$time;kill -9,$pid"); 
    die; # shouldn't get here 
} 

第一fork打完你的孩子的過程。第二個fork用於運行一個進程以在$time秒之後終止第一個進程。

相關問題