基于Perl的一个网站监控脚本

朋友给了我一个课题,就是用perl实现一个网站监控的脚本。

这个脚本主要实现的功能就那么几点,每间隔一段时间获取网站的应答状态、网站的响应时间。

如果应答出错,通过邮件的形式将应答状态码发送过来。

首先先处理一下应答状态。

这个可以使用LWP::UserAgent实现。

实现很简单,通过查看CPAN的例子可以看到 http://search.cpan.org/~mschilli/libwww-perl-6.08/lib/LWP/UserAgent.pm

require LWP::UserAgent;

 

my $ua = LWP::UserAgent->new;

$ua->timeout(10);

$ua->env_proxy;

 

my $response = $ua->get('http://search.cpan.org/');

 

if ($response->is_success) {

    print $response->decoded_content;  # or whatever

}

else {

    die $response->status_line;

}

比较容易理解,起初是new一个LWP::UserAgent的对象,设置超时时间为10秒,环境变量获取代理设置,然后去获取网页的应答,访问成功则对应的$response->is_success为真,否则会返回错误的状态码。

这里需要说明一下的是,早期的LWP::UserAgent似乎只支持http而不支持https的,如果使用https的协议需要再安装一个LWP::Protocol::https,所以在没有装这个模块的时候会出一个错误。模块都是由cpan直接安装的,命令行打cpan然后install LWP::UserAgent,install LWP::Protocol::https这样。

接下来处理网站的响应时间,发现LWP::UserAgent似乎没有这个处理,故使用了Net::Ping这个模块,同样第一次使用的话先得通过cpan进行install。由于cpan中的模块有很多,模块可能还有更好的选择。

下面是cpan中给出的例子:http://search.cpan.org/~smpeters/Net-Ping-2.41/lib/Net/Ping.pm

# High precision syntax (requires Time::HiRes)

    $p = Net::Ping->new();

    $p->hires();

    ($ret, $duration, $ip) = $p->ping($host, 5.5);

    printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n", 1000 * $duration)

      if $ret;

    $p->close();

Net::Ping->new([$proto [, $def_timeout [, $bytes [, $device [, $tos [, $ttl ]]]]]]);

$proto的default值是tcp,其他还有"udp", "icmp", "stream", "syn", or "external"这些。

这里我用到的是syn这个,当这个syn协议被指定时,将会发送一个TCP SYN packet到网站并马上返回,syn包发送成功则返回true,发送失败则返回falase,由于不需要像tcp那样经过三次握手,返回的值可能是不确定的,不过由于响应的速度快,更适合向多个地址发送packet。

($ret, $duration, $ip) = $p->ping($host, 5.5);

返回成功则ret将会为true,得到一个包的返回时间duration,和域名对应的ip地址,5.5表示timeout,default值为5秒。

$p->hires();

这个函数需要使用Time::HiRes这个模块,为了返回微秒级的响应时间,就必须使用这个函数,所以duration得到的值是个微秒级的浮点型数值,故*1000将其转化成毫秒单位。

同样是封存了挺久的一份草稿呀。不过这里涉及到了Perl的几个库,所以就当一份资料存起来吧。

你可能感兴趣的:(perl)