/ / पर्ल स्क्रिप्ट में टाइमआउट के लिए सिस्टम कमांड नहीं मिल सकता है - पर्ल

Perl स्क्रिप्ट में perout के लिए सिस्टम कमांड नहीं मिल सकता है - perl

मैं इधर-उधर भटक गया और कुछ अन्य प्रश्नों को पढ़ने के बारे में बताया कि समय की अवधि के बाद चलने से रोकने के लिए एक कमांड मिल रही है लेकिन मैंने सब कुछ करने की कोशिश नहीं की।

कमांड यह निर्दिष्ट करेगा कि यह निर्दिष्ट समय के बाद बंद होना चाहता है (यह एक संक्षिप्त सेकंड के लिए टर्मिनल प्रॉम्प्ट लौटाता है) लेकिन बस जा रहा है और बंद नहीं करेगा।

मेरा कोड यहाँ है:

#!/usr/bin/perl

use strict;
use warnings;


use Try::Tiny;

try {
local $SIG{ALRM} = sub { die "alarmn" };
alarm 5;
system("ping 192.168.1.1");
alarm 0;
}
catch {
die $_ unless $_ eq "alarmn";
print "timed outn";
};
exit;

टर्मिनल में आउटपुट इस तरह दिखता है:

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.98 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=3.13 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=3.20 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=3.17 ms
64 bytes from 192.168.1.1: icmp_seq=5 ttl=64 time=3.16 ms
64 bytes from 192.168.1.1: icmp_seq=6 ttl=64 time=3.11 ms
64 bytes from 192.168.1.1: icmp_seq=7 ttl=64 time=3.18 ms
64 bytes from 192.168.1.1: icmp_seq=8 ttl=64 time=3.20 ms
64 bytes from 192.168.1.1: icmp_seq=9 ttl=64 time=3.22 ms
64 bytes from 192.168.1.1: icmp_seq=10 ttl=64 time=3.20 ms
skilo@hp-xubuntu:~/perlstuff$ 64 bytes from 192.168.1.1: icmp_seq=11 ttl=64 time=3.06 ms
64 bytes from 192.168.1.1: icmp_seq=12 ttl=64 time=3.19 ms
64 bytes from 192.168.1.1: icmp_seq=13 ttl=64 time=3.21 ms
64 bytes from 192.168.1.1: icmp_seq=14 ttl=64 time=3.21 ms

ध्यान दें कि यह कैसे रोकने की कोशिश करता है, लेकिन "टी।"

उत्तर:

उत्तर № 1 के लिए 4

पर्ल "सिस्टम" बिल्टिन फ़ंक्शन आपकी प्रक्रिया का समर्थन करता है, और कांटा द्वारा बनाई गई बाल प्रक्रिया में, यह "पिंग" प्रोग्राम को निष्पादित करता है। फिर, मूल प्रक्रिया बच्चे की प्रक्रिया समाप्त होने का इंतजार करती है।

आपका अलार्म टाइमर और सिग्नल हैंडलर प्रतीक्षा प्रक्रिया को बाधित करता है, और फिर पृष्ठभूमि में चल रहे बच्चे की प्रक्रिया को छोड़कर, माता-पिता को समाप्त कर देता है।

आपको क्या करना होगा:

  1. अलार्म के समय के बाद, संकेत भेजकर बच्चे की प्रक्रिया को मार दें
  2. आपको अभी भी (मैन्युअल रूप से) प्रक्रिया पर इंतजार करना चाहिए, ताकि ज़ोंबी होने से बचा जा सके।

इसे इस्तेमाल करे:

#!/usr/bin/perl

use strict;
use warnings;



eval {
local $SIG{ALRM} = sub { die "alarmn" };
alarm 5;
system("ping -v 192.168.1.1");
alarm 0;
};
if ($@) {
die $@ unless $@ eq "alarmn";
print "timed outn";
kill 2, -$$;
wait;
};
exit;

नोट: मेरे पास कोशिश नहीं थी :: मेरे सिस्टम पर टिनी तो मैंने पुराने स्कूल से निकाले गए ब्लॉक को बदल दिया। लेकिन यह एक ही काम करना चाहिए।

यह "मार" कमांड एक सिग्नल नंबर लेता है (मैंने इस्तेमाल कियाSIGINT के लिए 2, जो ctrl-c दबाने के बराबर है) और मारने के लिए एक या अधिक प्रक्रियाएं। $ $ मौजूदा प्रक्रिया का मार्ग है; एक नकारात्मक मूल्य का वर्तमान प्रक्रिया से जुड़े पूरे प्रक्रिया समूह (जो प्रभावी रूप से सभी बाल प्रक्रियाओं का मतलब है) को मारने का प्रभाव पड़ता है। ध्यान दें कि यह पूरी तरह से पोर्टेबल नहीं है - यदि आप पाते हैं कि यह आपके सिस्टम पर काम नहीं करता है तो आपको बच्चे की प्रक्रिया के वास्तविक पीआईडी ​​को खोजने में सक्षम होने की आवश्यकता है। ऐसा करने में सक्षम होने के लिए आपको सिस्टम को फोर्क के साथ कॉल के साथ बदलना चाहिए और फिर इस तरह निष्पादित करना चाहिए:

#!/usr/bin/perl

use strict;
use warnings;


my $childPid;
eval {
local $SIG{ALRM} = sub { die "alarmn" };
alarm 5;
if ($childPid = fork()) {
wait();
} else {
exec("ping -v 192.168.1.1");
}
alarm 0;
};
if ($@) {
die $@ unless $@ eq "alarmn";
print "timed outn";
kill 2, $childPid;
wait;
};
exit;