У меня есть Perl-скрипт, который запускает серию пакетных скриптов для регрессионного тестирования. Я хочу реализовать тайм-аут в пакетных скриптах. В настоящее время у меня есть следующий код.
my $pid = open CMD, "$cmd 2>&1 |";
eval {
# setup the alarm
local $SIG{ALRM} = sub { die "alarm\n" };
# alarm on the timeout
alarm $MAX_TIMEOUT;
log_output("setting alarm to $MAX_TIMEOUT\n");
# run our exe
while( <CMD> ) {
$$out_ref .= $_;
}
$timeRemaining = alarm 0;
};
if ($@) {
#catch the alarm, kill the executable
}
Проблема в том, что независимо от того, какое значение я установил для максимального тайм-аута, сигнал тревоги никогда не срабатывает.Я пробовал использовать Perl :: Unsafe :: Signals, но это не помогло.
Является ли это лучшим способом выполнения пакетных сценариев, если я хочу иметь возможность захватывать их вывод? Есть ли другой способ сделать то же самое, что позволило бы мне использовать будильники, или есть другой способ, кроме будильников, для тайм-аута программы?
Я создал тестовый сценарий, чтобы подтвердить, что будильник работает с моим Perl и Windows версия, но она не работает, когда я запускаю такую команду.
Я запускаю это с activeperl 5.10.1 в Windows 7 x64.