2010-10-18 17 views
5

निम्न पर्ल एक-लाइनर को एक शेल स्क्रिप्ट में एकीकृत करने का प्रयास कर रहा है। यह कोड एक पर्ल स्क्रिप्ट के भीतर काम करता है लेकिन शेल स्क्रिप्ट से निष्पादित एक-लाइनर के रूप में नहीं।मैं नेट :: पिंग के साथ एक पर्ल वन-लाइनर के साथ एक होस्ट को कैसे पिंग कर सकता हूं?

मैंने $host को किसी भी भाग्य के साथ वास्तविक होस्टनाम के साथ बदलने की कोशिश की है। $host को बदलने के लिए

#!/bin/ksh 

hosts="host1 host2 host3" 

PERL=/usr/bin/perl 

# Check to see if hosts are accessible. 
for host in $hosts 
do 
    #echo $host 
    $PERL -e 'use Net::Ping; $timeout=5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$host is alive \n" if $p->ping($host); $p->close;' 
done 
+3

से का उपयोग आप के बजाय पर्ल क्यों प्रयोग कर रहे हैं सिर्फ 'ping' सकता है? –

+0

मैंने इसे पहले से लिखित शेल स्क्रिप्ट में एकीकृत किया है कि मुझे पोर्ट की परवाह नहीं है। यह एक सुविधाजनक, लगातार तेज़ (यानी, यह लटका नहीं है) के रूप में कार्य करता है जो एक-लाइनर है जो प्लेटफॉर्म पर काम करता है। –

उत्तर

1

प्रयास करें:

$PERL -e 'use Net::Ping; $timeout=5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$host is alive \n" if $p->ping($host); $p->close;' 
$ARGV[0] साथ

, पहली कमांड लाइन तर्क:

$PERL -e 'use Net::Ping; $timeout=5; $p=Net::Ping->new("icmp", $timeout) or die bye ; print "$ARGV[0] is alive \n" if $p->ping($ARGV[0]); $p->close;' $host 
+0

मैं इसे करने के बारे में सोचा था लेकिन दूर हो गया। हालांकि, यह मुझे एक अतिरिक्त विकल्प देता है जिसे मैं इस स्क्रिप्ट में एकीकृत कर सकता हूं। धन्यवाद ... –

9

खोल में एकल उद्धरण में व्याख्या किए जाने से $ मेजबान बंद करो। तो आप बस बंद कर सकते हैं और पुन: प्रारंभ एकल उद्धरण के रूप में आवश्यक:

perl -MNet::Ping -e 'if (Net::Ping->new("icmp", 5)->ping("'$host'")) {print "'$host' is alive\n"}' 

वैकल्पिक रूप से, आप एक पैरामीटर के रूप में मेजबान पारित कर सकते हैं - अन्य उत्तर देखें।

+0

दोह, बस sed के साथ की तरह। बहुत - बहुत धन्यवाद। –

0

यदि आप पर्ल का उपयोग करना चाहते हैं, तो अपनी स्क्रिप्ट चलाने के लिए पर्ल दुभाषिया का उपयोग करें।

#!/usr/bin/env perl -w 
use Net::Ping; 
$timeout=5; 
$p=Net::Ping->new("icmp", $timeout) or die bye ; 
@hosts=qw/localhost 10.10.10.10/; 
foreach my $host (@hosts) { 
    print "$host is alive \n" if $p->ping($host); 
} 
$p->close; 

अन्यथा, आप के रूप में अच्छी ping आदेश सीधे खोल

#!/bin/bash 
for hosts in host1 host2 host3 
do 
    if ping ...... "$hosts" >/dev/null ;then 
     ..... 
    fi 
done 
+0

धन्यवाद। मैं सहमत हूं - विशेष रूप से उपयोग perl उपयोग करें। मैंने इसे पहले से लिखित शेल स्क्रिप्ट में एकीकृत किया है कि मुझे पोर्ट की परवाह नहीं है। यह एक सुविधाजनक, लगातार तेज़ (यानी, यह लटका नहीं है) एक लाइनर के रूप में कार्य करता है। –

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