天然パーマです。

PerlスクリプトでWebサイト死活管理

個人で作ってるサイトの死活監視を「再び」ちゃんとやろうと思っています。

そこで、Nagios使うまでも無く、Kazuhoさんの Kazuho@Cybozu Labs: 監視とは継続的なテストである、という話 (もしくは cronlog とテストスクリプトを組み合わせた監視手法について) みてシンプルに死活監視できるよなーと思って、 「Perlスクリプト」を書いてみました。 「死活」のみの監視なんで、サイトが正常では無かったらメールを飛ばすだけでいいという想定です。 設定をYAMLで持たせたかったり、メールをPerlから送りたかったりしたんで、 少しKazuhoさんのやってることより複雑になりましたが、まぁ簡単です。

 #!/usr/bin/perl
use strict;
use warnings;
use LWP::UserAgent;
use Email::Sender::Simple qw(sendmail);
use Email::MIME;
use Try::Tiny;
use YAML qw(LoadFile);
use Path::Class qw( file );

my $file = $ARGV[0] || "config.yaml";
die "Can't open $file" unless ( -f file($file)->stringify );
my $config = LoadFile( file($file) );
my $ua = LWP::UserAgent->new( agent => 'Monita/0.01', timeout => 30 );

for my $url ( @{ $config->{url} } ) {
    my $res = $ua->get($url);
    send_report( $res ) unless $res->is_success;
}

sub send_report {
    my $res = shift;
    my $email = Email::MIME->create(
        header => [
            From    => $config->{from},
            To      => $config->{to},
            Subject => $res->request->uri . ' : ' . $res->code,
        ],
        attributes => { content_type => 'text/plain', },
        body       => $res->status_line,
    );
    try { sendmail($email) }
    catch { my $error = $_; warn $error->message };
}

このようなconfig.yamlを用意して

 ---
from: xxxxxx@xxxxxx
to: xxxxxx@xxxxxx
url:
  - http://hoge.com/
  - http://moge.com/
 $ ./monita.pl config.yaml

と実行すればURLのリストにあるサイトで、200番以外のレスポンスを返却した時に、 ステータス情報と共にメールが届きます。 これをcrontabで定期的に実行すればOKですね。 リソースの定期的な把握についてはcactiとかcloudforecastとか使えばいいっすね。