मेरी पर्ल स्क्रिप्ट एक बाहरी प्रोग्राम चलाती है (जो एक एकल कमांड लाइन पैरामीटर लेती है) और इसके आउटपुट को संसाधित करती है। मूल रूप से, मैं यह कर रहा था:एक लटका बाल प्रक्रिया को मारें
my @result = `prog arg`;
हालांकि, पता चला है कि कार्यक्रम गाड़ी है और दुर्लभ मामलों में अप्रत्याशित रूप से लटका हुआ है। यदि मैं निश्चित समय के बाद बाहर नहीं निकला तो मैं प्रोग्राम को कैसे मार सकता हूं? स्क्रिप्ट को विंडोज और लिनक्स दोनों में काम करना है, और यह मेरी समझ है कि अलार्म और कांटे विंडोज में अच्छी तरह से काम नहीं करते हैं (या बिल्कुल)।
मुझे IPC::Run नामक एक मॉड्यूल मिला लेकिन मैं यह नहीं समझ सकता कि इसका उपयोग अपने दस्तावेज़ से ठीक से कैसे किया जाए। :-(मैं इस कोशिश की:।
use strict;
use warnings;
use IPC::Run qw(run timeout);
my $in;
my $out;
my $err;
my @result;
my @cmd = qw(prog arg);
run \@cmd, \$in, \$out, \$err, timeout (10) or die "@cmd: $?";
push @result, $_ while (<$out>);
close $out;
print @result;
एक परीक्षण के रूप में, मैं एक प्रोग्राम है जो सिर्फ 60 सेकंड सोता है, stdout
और बाहर निकलता है के लिए एक स्ट्रिंग प्रिंट जब मैं ऊपर कोड के साथ चलाने का प्रयास बनाई, इसके लिए लटकी हुई है 60 सेकंड (के बजाय 10 सेकंड, समय समाप्ति के रूप में विनिर्दिष्ट के लिए) और एक विचित्र त्रुटि के साथ रोकता:
IPC::Run: timeout on timer #1 at C:/Bin/Unix/Perl/site/lib/IPC/Run.pm line 2956
तो मैं एक और मॉड्यूल, Proc::Reliable पाया वर्णन से, यह ठीक करने के लिए जो मैं चाहता लगता है।। सिवाय इसके कि यह काम नहीं करता है! मैंने कोशिश की:
use strict;
use warnings;
use Proc::Reliable;
my $proc = Proc::Reliable->new();
$proc->maxtime (10);
my $out = $proc->run ("prog arg");
print "$out\n";
यह वास्तव में 10 सेकंड के बाद बाल प्रक्रिया को रोक देता है। अब तक सब ठीक है. लेकिन फिर मैंने बाहरी कार्यक्रम में संशोधन किया और इसे केवल 5 सेकंड के लिए सोया। इसका मतलब यह है कि कार्यक्रम उपरोक्त कोड में निर्दिष्ट 10-सेकंड टाइमआउट से पहले समाप्त होना चाहिए और इसके stdout
आउटपुट को $out
वेरिएबल में कैप्चर किया जाना चाहिए। लेकिन यह नहीं है! उपरोक्त स्क्रिप्ट कुछ भी आउटपुट नहीं करता है।
कोई विचार यह कैसे ठीक से करना है? (बग्गी बाहरी कार्यक्रम को ठीक करना एक विकल्प नहीं है।) अग्रिम धन्यवाद।
क्या आपने विश्वसनीय वस्तु से stderr, स्थिति और संदेश से आउटपुट प्रिंट करने का प्रयास किया है? – Nick
जब आप डीबग सेट करते हैं तो क्या होता है? 'Proc :: विश्वसनीय :: डीबग ($ स्तर);' – DVK
यदि मैं 'Proc :: विश्वसनीय :: डीबग (1) करता हूं; ', स्क्रिप्ट सिर्फ' Proc :: विश्वसनीय> ATTEMPT 0: 'prog arg' और कुछ नहीं। 'आउट आउट 'से कोई आउटपुट नहीं। (बेशक, यदि मैं मैन्युअल रूप से प्रोग्राम 'प्रोग लॉग' चलाता हूं, तो मैं आउटपुट प्राप्त करता हूं।) – Vess