Как указать лимит времени ожидания для системного вызова Perl?
Иногда мой системный вызов переходит в бесконечное состояние. Чтобы избежать этого, я хочу, чтобы вы могли выйти из вызова через определенное время.
Есть ли способ указать ограничение тайм-аута на system
?
system("command", "arg1", "arg2", "arg3");
Я хочу, чтобы тайм-аут был реализован из кода Perl для переносимости, а не для использования некоторых конкретных функций ОС, таких как ulimit.
Ответы
Ответ 1
Смотрите функцию alarm
. Пример из pod:
eval {
local $SIG{ALRM} = sub { die "alarm\n" }; # NB: \n required
alarm $timeout;
$nread = sysread SOCKET, $buffer, $size;
alarm 0;
};
if ([email protected]) {
die unless [email protected] eq "alarm\n"; # propagate unexpected errors
# timed out
}
else {
# didn't
}
В CPAN есть модули, которые обертывают их немного лучше, например: Time::Out
use Time::Out qw(timeout) ;
timeout $nb_secs => sub {
# your code goes were and will be interrupted if it runs
# for more than $nb_secs seconds.
};
if ([email protected]){
# operation timed-out
}
Ответ 2
Вы можете использовать IPC::Run запустить метод вместо системы. и установите тайм-аут.
Ответ 3
Как насчет System::Timeout?
Этот модуль расширяет system
, чтобы разрешить таймаут через указанные секунды.
timeout("3", "sleep 9"); # timeout exit after 3 seconds
Ответ 4
Я только что использовал команду timeout
в Perl + Linux, поэтому вы можете протестировать следующим образом:
for(0..4){
my $command="sleep $_"; #your command
print "$command, ";
system("timeout 1.1s $command"); # kill after 1.1 seconds
if ($? == -1 ){ printf "failed to execute: $!" }
elsif($?&127 ){ printf "died, signal %d, %scoredump", $?&127, $?&128?'':'no '}
elsif($?>>8==124){ printf "timed out" }
else { printf "child finished, exit value %d", $? >> 8 }
print "\n";
}
Выход после 4,317 секунд:
sleep 0, child finished, exit value 0
sleep 1, child finished, exit value 0
sleep 2, timed out
sleep 3, timed out
sleep 4, timed out
Команда timeout
является частью всех основных "нормальных" дистрибутивов Linux afaik, входящих в состав ядра.