我正在編寫一個Perl腳本,它將寫入一些輸入並將這些輸入發送到外部程序。有一個小但不爲零的機會,這個程序將被掛起,和我想不想來一次出來:如何超時可能掛起的分叉進程?
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
目前的情況是,$ num_secs_to_timeout後,program_of_interest仍然存在。我試圖殺死它在匿名子程序$SIG{ALRM}
如下:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
但這並不做任何事情。 program_of_interest仍然存在。我該如何去殺死這個過程?
我認爲「kill 9, - $ PID」應該是「kill -9,$ PID」。我使用了系統(「kill -9 $ PID」)。 – Boolean 2013-06-03 19:34:15
我認爲「kill -9 $ PID」應該進一步是「kill -9 $ pid」,但是,否定pid表示殺死一個進程組,而不僅僅是一個進程。從kill文檔中可以看出:「與shell不同的是,如果SIGNAL爲負數,它將殺死進程組而不是進程(在System V上,負的進程號也會終止進程組,但這不是可移植的)」 – simpleuser 2014-04-03 17:59:54