― Web Technology and Life ―

pingに関するメモ(PerlだとNet::Ping::Externalが便利)

2013-09-08
ping google.co.jpとかCUIでたたくと、レスポンスかえってくるので、死活監視的にpingをPerlで送ろうと思って、Net::Ping使おうとすると事故だよって話とそもそもpingについて。

pingに関する基礎知識というか勝手な前提

linuxのpingコマンドはICMPを使っていてPortとか関係ない。基本的に、pingによる監視は、サーバーの生死の根幹を確認するためであり、pingで返答なければ、大ごとだけど、ネットワーク上ロストして、たまに帰ってこないことがあるから、一回くらいで慌てない?

Perlでのサンプルスクリプト

#!/usr/bin/env perl
use strict;
use warnings;
use utf8;
use Net::Ping::External qw/ping/;
use Net::Ping;

my $timeout = 10;
my $host    = 'google.co.jp';

my $ret_normal   = normal_ping($host,$timeout);
my $ret_external = external_ping($host,$timeout);

warn $ret_normal;
warn $ret_external;

sub normal_ping {
    my ($host, $timeout) = @_;

    my $p = Net::Ping->new("tcp");
    $p->hires(1);
    my ( $ret, ) = $p->ping( $host, $timeout );
    $p->close;

    if ($ret) {
        return "alive"; # success
    } else {
        return "dead";
    }
}

sub external_ping {
    my ($host, $timeout) = @_;

    my ( $ret, ) = ping(host => $host, timeout => $timeout);

    if ($ret) {
        return "alive"; # success
    } else {
        return "dead";
    }
}

出力は以下の通り。

dead at ping.pl line 14.
alive at ping.pl line 15.

Perlだと、Net::Pingを使えばいいようですが、Net::PingでICMPを使うにはroot権限が必要らしく結局tcpを使うんだけど、pingのtcp許可していないのが多いんで、Net::Ping::Externalを使ってICMPを使ったpingを送るのがいいかもよってことですね。

結局何がいいのか?

よくわかりません・・・

pingによる死活監視において

  • 80ポートを使ったping
  • tcpポートを使ったping
  • ICMPを使ったping

とあったわけですが、まぁ無難なのが、最後のやつだけど、80ポート使った方が安定するとか、tcpポート使った方が安定するとかあるんかなー?でも、特定のport使うとファイヤーウォールかけているとダメだったりするので、汎用的なのは、無難にICMPだと思うけど、80ポート開けているなら、80使った方が安定するし、ping的に問題なければそうしたい。。。。

実際、Net::Ping::External使って、さくらVPSのサーバー監視しているんですが、2,3日に1回くらい反応なかったりするから困っているんですよねー。Retryをかけようかと思っているんですが、使っているApp::MadEyeがいかんせん外部サーバー監視用じゃないからちょっとどうしよっかなーという感じ。

何事もなんちゃってでやっていると、イカンですね。。。

参考

Perl update_at : 2013-09-08T02:48:51
hirobanex.netの更新情報の取得
 RSSリーダーで購読する   
blog comments powered by Disqus