设为首页 收藏本站
查看: 855|回复: 0

[经验分享] 基于Perl的一个网站监控脚本

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-12-26 09:00:38 | 显示全部楼层 |阅读模式
  朋友给了我一个课题,就是用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的几个库,所以就当一份资料存起来吧。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-156410-1-1.html 上篇帖子: perl文件句柄的传递 下篇帖子: Perl、PHP、Python、Java 和 Ruby 比较【转载+整理】
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表