2012-08-08 28 views
7

Bir dizi başka program çalıştırması ve çıktıları için çıktılarını toplaması gereken bir programım var. Her şey standart çıktı çıktığında çalışıyor. Benim iki sorunlara götürüyorPerl'de çıktı olarak günlüğe kaydetme

:

  1. nasıl yakalayabilir hem STDIN ve bir dosyada başka bir programın STDERR?

  2. programı hattına sıkışıp alacak (sadece STDERR veya çıkış) hayır hiç çıkışı yoksa: Başka olası çıkış için programın beklemesi nasıl

    while (<$input>) 
    

Belirsiz çalışma süresi programı, ve programın yürütme bittiğinde hiçbir çıkış yoksa devam eder. İşte

kodunun o bölümdür

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\""; 
} 

not: $fh benim günlük dosyasına yazmak için kullanılan benim dosya işleyicisi ve @errors içten benim programda hataları raporlamak için kullanılır.

DÜZENLEME: Proc::Reliable rotayı çalışırken yaşanan Bir sorun STDOUT ve STDERR üzerindeki etkileri sonra var gibi görünüyor yani, ben her çağrıdan sonra bu çalışmasına düzeltmek gerekir. Bu benim kodumda başka bir soruna yol açar. Paralel olarak çalışıyorum ve herhangi bir değişiklikve STDERR tüm iş parçacığı (en az Windows kullanarak).

IO::CaptureOutput benim için aynı sorunu var, ancak gerçekleşmesi aşağıdaki hatayı içten STDOUT ve STDERR jumbling düzeltmeye çalışır ve neden: Proc::Reliable de

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

[Duplede stderr, stdout ve çıkış kodlarını bir kerede nasıl yakalarsınız?] Olası bir kopyası (http://stackoverflow.com/questions/109124/how-do-you-capture-stderr- stdout'u-ve-çıkış kodu-all-at-once-in-perl) – daxim

cevap

1

ardından 2>&1 notasyonu aynı yere standart hatasını gönderir standart çıktı:

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

Hem standart çıktı hem de standart hata, Perl loglama komut dosyasının standart girdisine gönderilir.

Kaydedici komut dosyasındaki giriş döngüsü, okunacak bir giriş olana kadar veya borunun açık olması için tüm işlemler işlemeyi bitirinceye kadar beklemeye (genellikle çıktıkları için) asılacaktır.

İlgili konular