मैं एक पर्ल स्क्रिप्ट लिख रहा हूं जो कुछ इनपुट लिखेंगे और उन इनपुट को बाहरी कार्यक्रम में भेज देगा। वहाँ एक छोटी लेकिन गैर शून्य संभावना है कि इस कार्यक्रम रखती है, और मैं उसका समय हैं:मैं एक फोर्कड प्रक्रिया का समय कैसे लगा सकता हूं जो लटका सकता है?
my $pid = fork;
if ($pid > 0){
eval{
local $SIG{ALRM} = sub { die "TIMEOUT!"};
alarm $num_secs_to_timeout;
waitpid($pid, 0);
alarm 0;
};
}
elsif ($pid == 0){
exec('echo blahblah | program_of_interest');
exit(0);
}
यह अब खड़ा के रूप में $ num_secs_to_timeout के बाद, program_of_interest अभी भी बनी हुई है। मैं इस प्रकार $SIG{ALRM}
के लिए अनाम सबरूटीन में यह मारने की कोशिश की:
local $SIG{ALRM} = sub{kill 9, $pid; die "TIMEOUT!"}
लेकिन यह कुछ भी नहीं है। program_of_interest अभी भी जारी है। मैं इस प्रक्रिया को मारने के बारे में कैसे जा सकता हूं?
मुझे लगता है कि "मारो 9, - $ पीआईडी" "मार -9, $ पीआईडी" होना चाहिए। मैंने इसके बजाय सिस्टम ("मार -9 $ पीआईडी") का इस्तेमाल किया। – Boolean
मुझे लगता है कि "kill -9 $ pID" को "kill -9 $ pid" होना चाहिए, लेकिन हां, नकारात्मक पिड केवल एक प्रक्रिया के बजाय एक प्रक्रिया समूह को मारने का संकेत देता है। हत्या दस्तावेज से: "शैल के विपरीत, यदि सिग्नल नकारात्मक है, तो यह प्रक्रियाओं के बजाय प्रक्रिया समूहों को मारता है। (सिस्टम वी पर, एक नकारात्मक प्रोसेस संख्या भी प्रक्रिया समूहों को मार डालेगी, लेकिन यह पोर्टेबल नहीं है।)" – simpleuser