Perl-аларм с подпроцессом

У меня есть 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.

6
задан Mark Meyer 9 December 2011 в 22:22
поделиться