Ich habe ein Programm, das eine Reihe anderer Programme ausführen und ihre Ausgabe für Protokollierungszwecke sammeln soll. Alles funktioniert gut, solange die Ausgabe an Standard out ausgegeben wird.Protokollierung von der Ausgabe in Perl
Das hat mich auf meine zwei Problemen führt:
Wie kann ich beide
STDIN
undSTDERR
eines anderen Programms in einer Datei erfassen?Wenn es keine Ausgabe überhaupt ist (oder Ausgang zu
STDERR
nur) das Programm auf der Linie stecken:while (<$input>)
Wie kann ich das Programm wartet auf mögliche Ausgabe von einem anderen machen Programm der unbestimmten Laufzeit, und weiterhin fortfahren, wenn bis zu der Zeit, zu der das Programm die Ausführung beendet, keine Ausgabe erfolgt.
Hier ist der Abschnitt des Codes
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\"";
}
Anmerkung: $fh
ist meine Datei-Handler verwendet, um meine Log-Datei zu schreiben, und @errors
für interne Berichterstattung Fehler in meinem Programm verwendet wird.
EDIT: Ein Problem, das ich mit dem Versuch, die Proc::Reliable Route erfahren ist, dass es nach Auswirkungen auf STDOUT
und STDERR
zu haben scheint, und ich würde die nach jedem Aufruf beheben ausführen müssen. Dies führt zu einem anderen Problem in meinem Code. Ich laufe parallel und alle Änderungen an STDOUT
und STDERR
wirken sich auf alle Threads (unter Windows mindestens).
IO::CaptureOutput hat das gleiche Problem für mich, aber er versucht, die STDOUT
und STDERR
jumbling intern und verursacht den folgenden Fehler zu korrigieren auftreten:
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
mögliche Duplikate von [Wie erfassen Sie stderr, stdout und den Exit-Code auf einmal in Perl?] (Http://stackoverflow.com/questions/109124/how-do-you-capture-stderr- stdout-and-the-exit-code-alles-bei-einmal-in-perl) – daxim