Ведение журнала с вывода в Perl

У меня есть программа, которая должна запускать набор других программ и собирать их выходные данные для целей ведения журнала. Все работает нормально, пока есть выход на стандартный выход.

Это приводит меня к двум моим проблемам:

  1. Как я могу захватить и STDINи STDERRдругой программы в один файл?

  2. Если вывода нет вообще (или вывода на STDERRтолько ), программа застрянет на строке:

    while (<$input>)
    

Как я могу заставить программу ждать возможного вывода из другой программы с неопределенным временем выполнения и продолжать работу, если к моменту завершения выполнения программы нет вывода.

Вот этот раздел кода

my $pid = open (my $input, '-|', "$prog $args")
        or push @errors, "A failute has occurred in $prog $args";
if(not @errors){
    while (<$input>){ #POSSIBLE LOCATION FOR HANG UP IF NO PRINTING IS DONE
        if($input =~ /^END\n$/){
            last;
        }
        print $fh $_;
    }
}
else{
    print $fh "An error has occurred with executing \"$prog $args\"";
}

примечание:$fhмой файловый обработчик используется для записи в мой файл журнала, а @errorsиспользуется для внутреннего сообщения об ошибках в моей программе.

РЕДАКТИРОВАТЬ :Одна проблема, с которой я столкнулся при использовании маршрута Proc ::Reliable , заключается в том, что он, по-видимому, имеет последствия для STDOUTи STDERR, и мне нужно будет исправлять их после каждого вызова для запуска. Это приводит к другой проблеме в моем коде. Я работаю параллельно, и любое изменение STDOUTи STDERRвлияет на все потоки (. используя Windows по крайней мере).

IO ::CaptureOutput имеет ту же проблему для меня, но он пытается исправить внутреннюю путаницу STDOUTи STDERRи вызывает следующую ошибку:

Couldn't remove temp file 'C:\Users\SBLAKE~1\AppData\Local\Temp\m8E3pUGfOS' - Permission denied at C:/Perl/site/lib/IO/CaptureOutput.pm line 82

7
задан Brad Gilbert 13 October 2012 в 00:10
поделиться