У меня есть программа, которая должна запускать набор других программ и собирать их выходные данные для целей ведения журнала. Все работает нормально, пока есть выход на стандартный выход.
Это приводит меня к двум моим проблемам:
Как я могу захватить и STDIN
и STDERR
другой программы в один файл?
Если вывода нет вообще (или вывода на 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