2012-08-08 6 views
7

में आउटपुट से लॉग इन करना मेरे पास एक प्रोग्राम है जो अन्य प्रोग्रामों का एक सेट चलाने और लॉगिंग उद्देश्यों के लिए अपना आउटपुट एकत्र करने वाला है। जब तक मानक आउटपुट आउटपुट होता है तब तक सब कुछ ठीक काम कर रहा है।पर्ल

जो मुझे मेरे दो समस्याओं को जन्म देता:

  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 पर सभी परिवर्तन (कम से कम विंडोज का उपयोग करके) पर सभी परिवर्तनों को प्रभावित करता है।

IO::CaptureOutput मेरे लिए एक ही मुद्दा है, लेकिन यह होने के लिए आंतरिक रूप से STDOUT और STDERR jumbling सही करने के लिए कोशिश करता है और निम्न त्रुटि का कारण बनता है: Proc::Reliable पर

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

संभावित डुप्लिकेट [आप पर्ल में एक बार में stderr, stdout, और निकास कोड कैप्चर कैसे करते हैं?] (Http://stackoverflow.com/questions/109124/how-do-you-capture-stderr- stdout और निकास-कोड-सब-एट-एक बार में पर्ल) – daxim

उत्तर

1

आप एक POSIX-जैसा शेल से लांच, तो 2>&1 अंकन मानक त्रुटि एक ही जगह के रूप में भेजता है मानक आउटपुट:

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

मानक आउटपुट और मानक त्रुटि दोनों मानक लॉगिंग स्क्रिप्ट के मानक इनपुट में भेजी जाती हैं।

लॉगर स्क्रिप्ट में इनपुट लूप पढ़ने के लिए इनपुट होने तक इंतजार कर रहा है, या जब तक पाइप बंद करने के लिए खुली पाइप के साथ सभी प्रक्रियाओं को बंद नहीं किया जाता है (आमतौर पर वे बाहर निकलते हैं)।

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^