2010-04-21 68 views
3

我有一個Perl腳本,用於運行使用反引號啓動的文件處理工具。問題在於偶爾會出現該工具掛起的情況,並且需要將其殺死才能處理其餘文件。如何在超時後終止Perl系統調用?

最好的方式來應用超時之後,父腳本將殺死掛起的過程最好的方式是什麼?

在我使用的那一刻:

foreach $file (@FILES) { 
    $runResult = `mytool $file >> $file.log`; 
} 

但當mytool n秒後掛斷,我想能夠殺死它,繼續下一個文件。

+0

相關:http://stackoverflow.com/questions/2562931/how-can-i-terminate-a-system-command-with-alarm-in-perl – mob 2010-04-21 05:48:57

回答

6

我可能不會使用``爲此。相反,我會open()命令與|,以便它異步運行。這將返回pid。然後你可以做一個非阻塞wait()與睡眠循環,在一定次數的嘗試沒有成功後,發出一個信號給孩子pid

+0

這樣做的伎倆,謝謝。 – Fergal 2010-04-21 02:47:44

3

您需要將$ SIG {'ALRM'}設置爲處理程序例程,然後使用超時值調用警報函數。例如:

$SIG{'ALRM'} = handler; 
foreach $file (@FILES) { 
    alarm(10); 
    $runResult = `mytool $file >> $file.log`; 
    alarm(0); 
} 

sub handler { 
    print "There was a timeout\n"; 
} 

這應該在10秒後觸發處理子程序。將鬧鐘設置爲0將關閉鬧鐘。

+0

相關:http://stackoverflow.com/questions/3967470/how-can-i-specify-timeout-limit-for-perl-system-call/3967987#3967987相同的解決方案,但略有不同的實施,這對我來說更好在「嚴格使用」 – engtech 2011-03-01 20:56:59

相關問題