2010-10-18 37 views
5

Cố gắng tích hợp một lớp lót Perl sau vào một kịch bản lệnh shell. Mã này hoạt động trong một kịch bản Perl nhưng không phải là một lớp lót được thực thi từ một kịch bản lệnh shell.Làm thế nào tôi có thể ping một máy chủ với một Perl một lớp lót với Net :: Ping?

Tôi đã thử thay thế $host bằng tên máy chủ thực không có may mắn.

#!/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

Tại sao bạn đang sử dụng perl thay vì chỉ 'ping'? –

+0

Tôi tích hợp điều này vào một kịch bản shell đã viết mà tôi không quan tâm đến cổng. Điều này phục vụ như một thuận tiện, liên tục nhanh chóng (có nghĩa là, nó không treo) một lớp lót hoạt động trên nền tảng. –

Trả lời

1

Cố gắng thay thế $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;' 

với $ARGV[0], dòng lệnh đầu tiên đối số:

$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

Tôi 'gần như' nghĩ đến việc này nhưng quay đi. Tuy nhiên, điều này mang lại cho tôi một tùy chọn bổ sung mà tôi có thể tích hợp vào tập lệnh này. Cảm ơn ... –

9

Các dấu nháy đơn trong vỏ dừng host $ từ được giải thích. Vì vậy, bạn chỉ có thể dừng và khởi động lại các dấu nháy đơn theo yêu cầu:

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

Hoặc, bạn có thể chuyển máy chủ dưới dạng tham số - xem câu trả lời khác.

+0

Doh, giống như với sed. Cảm ơn rất nhiều. –

0

Nếu bạn muốn sử dụng Perl, hãy sử dụng trình thông dịch Perl để chạy tập lệnh của bạn.

#!/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; 

Nếu không, bạn cũng có thể sử dụng lệnh ping trực tiếp từ vỏ

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

Cảm ơn. Tôi đồng ý - chỉ sử dụng perl độc quyền. Tôi tích hợp điều này vào một kịch bản shell đã viết mà tôi không quan tâm đến cổng. Điều này phục vụ như là một thuận tiện, liên tục nhanh chóng (có nghĩa là, nó không treo) một lớp lót. –

Các vấn đề liên quan