2012-08-08 10 views
7

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:

  1. Wie kann ich beide STDIN und STDERR eines anderen Programms in einer Datei erfassen?

  2. 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 
+0

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

Antwort

1

Wenn Sie von einem POSIX-artige Shell starten, dann ist die 2>&1 Notation sendet Standardfehler an der gleichen Stelle wie die Standardausgabe:

some-program-to-be-logged 2>&1 | perl logger.pl -o /chosen/log.file 

Sowohl Standardausgabe als auch Standardfehler werden an die Standardeingabe des Perl-Protokollierungsskripts gesendet.

Die Eingabe-Schleife im Logger-Skript wartet, bis eine Eingabe zu lesen ist oder bis alle Prozesse mit der zum Schreiben geöffneten Pipe die Pipe schließen (normalerweise, weil sie beendet werden).

Verwandte Themen