zoukankan      html  css  js  c++  java
  • 基于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)
    ", 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的几个库,所以就当一份资料存起来吧。

  • 相关阅读:
    Pigeon源码分析(一)-- 服务注册
    使用postman配置header的惨痛经历
    Redis字典知识点总结
    SpringBoot和Mybatis结合原理
    Mycat误区解释
    Mycat之常用分片规则
    Mycat之ER表划分
    模拟死锁
    生产者消费者阻塞队列
    堆排序TopK
  • 原文地址:https://www.cnblogs.com/viroyiheng/p/4000807.html
Copyright © 2011-2022 走看看