朋友给了我一个课题,就是用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的几个库,所以就当一份资料存起来吧。