7

我有一个简单的脚本,可以定期(每隔几秒一次)验证该服务器是否有互联网连接。需要明确的是,它不会检查外部站点/服务/服务器是否处于活动状态。作为可靠的互联网目的地,我使用谷歌、雅虎等网站的 IP。通常我使用 3 个目的地(LAN、ISP 网络、ISP 外部)

我当前负责这个的代码只是一个简单而肮脏的调用ping

    my $pingResponse = `ping -c 1 -w 1 123.123.123.123`;
    my $isConnected = parsePingResponse($pingResponse);

它似乎有效,但我确信这不是完成这项任务的正确/最佳方式。至少有3个缺点:外部系统调用,速度慢,截止时间比较长,1秒。

所以,我的问题是:如何以失败的方式简单有效地实现ping功能,以验证互联网连接是否有效?

(我认为LWP是一种矫枉过正。站点或页面是否可用并不重要,只要可以访问一些外部IP即可。可能应该是涉及低级网络的简单事情)

4

4 回答 4

6

这样做的失败方法是Net::Ping

my $p = Net::Ping->new;
if ($p->ping("123.123.123.123", 1)) {
    print "Host is reachable\n";
}

如果您希望命令运行得更快,超时可能是一个浮点数(例如 0.5)。您需要选择适合您需要的超时时间;较高的超时时间更可能对 Internet 连接正确,但需要更长的时间。

于 2013-02-14T12:55:56.467 回答
2

上面rjh给出的例子在很多情况下都不起作用,因为他没有正确初始化构造函数。下面的这个例子可能会有所帮助:

use Net::Ping;

my $p = Net::Ping->new("icmp");
while(1){
printf "Checking for internet\n";
    if ($p->ping("www.google.com")){
    printf "Internet connection is active!\n";
        sleep 1;
    last; #break out of while loop if connection found
    }
    else{
    printf "Internet connection not active! Sleeping..\n";
        sleep 60*60;
    }   
}
于 2013-03-30T08:39:02.923 回答
0

上面 ping 到 google 的答案(从 2013 年开始)的优点是它不依赖数字来检查互联网连接,因此可以说它更通用。但是,在 2019 年的典型环境中,它只有在修改某些部分以在连接未启动时捕获名称解析错误时才能工作。这是在 perl 中执行此操作的一种方法。在 Debian 上下文中,它可以从终端使用 'sudo perl program.pl' 启动:

use warnings;
use strict;
use Net::Ping;
my $p = Net::Ping->new("icmp");
my $netstatus = 1;
eval { $p->ping("www.wikipedia.org"); 1; }
or do { $netstatus = 0; };
if ($netstatus == 1 )
  { printf "Internet connection is active!\n"; }
else
  { printf "Internet connection not active.\n"; }
于 2019-09-06T19:58:59.487 回答
0

我刚才给出的答案是 ping 维基百科,需要启动 root 权限(例如,“sudo”)。为了避免授予程序 root 权限,可以通过命令行 ping 并读取其输出,或者安装实验性 perl 扩展 libnet_ping_external,例如 https://launchpad.net/ubuntu/zesty/amd64/libnet-ping -external-perl/0.13-1 (该页面上的 .deb 已保存,在您验证其真实性后,您可以打开它进行安装,例如通过文件管理器。)归功于https://forums.gentoo.org/viewtopic- p-2920594.html用于此方法。这是一个使用此模块在没有 root 权限的情况下在 perl 中 ping 的示例(虽然速度较慢)。

use warnings;
use strict;
use Net::Ping::External qw(ping);
my $connected = ping(host => "www.google.com");
if ($connected)
  { printf "Internet connection is active!\n"; }
else
  { printf "Internet connection not active.\n"; }
于 2019-09-06T21:06:38.037 回答