Определение того, называется ли оно «застрявшим в бесконечном цикле» Проблема останова и неразрешимо.
Если вы хотите убить его, вам придется форкнуть приложение, используя fork
и затем убейте его с другого форка, если он идет слишком долго.
Вы можете определить, будет ли процесс идти слишком долго, по крайней мере, по этому
use POSIX ":sys_wait_h";
waitpid($pid, WNOHANG)>0 #waitpid returns 0 if it still running
, согласнона эту страницу руководства
Я не уверен, насколько хорошо она работает в различных системах, вы можете попробовать.
Не прямой ответ, но я могу рекомендовать использоватьМодуль forks
, если вы хотите с легкостью форкнуть, но он работает только в системах UNIX ( не windows).
ОК, больше кода помощи:) Он работает в UNIX, согласно perlfork perldoc, он должен работать в Windows точно так же.
use warnings;
use strict;
use POSIX ":sys_wait_h";
my $exited_cleanly; #to this variable I will save the info about exiting
my $pid = fork;
if (!$pid) {
system("anything_long.exe"); #your long program
} else {
sleep 10; #wait 10 seconds (can be longer)
my $result = waitpid(-1, WNOHANG); #here will be the result
if ($result==0) { #system is still running
$exited_cleanly = 0; #I already know I had to kill it
kill('TERM', $pid); #kill it with TERM ("cleaner") first
sleep(1); #wait a bit if it ends
my $result_term = waitpid(-1, WNOHANG);
#did it end?
if ($result_term == 0) { #if it still didnt...
kill('KILL', $pid); #kill it with full force!
}
} else {
$exited_cleanly = 1; #it exited cleanly
}
}
#you can now say something to the user, for example
if (!$exited_cleanly) {...}