Custom Search

JITAKU_SVR_Wiki

久しぶりにperlでポート監視をすることになり、見直してみたらひどいソースだったので更新(でもこれが素晴らしいとは限らないので注意)。
古いソースは戒めのためにそのまま掲載。

#!/usr/bin/perl

use Socket;
use strict;

my $hostname = '$ARGV[0]';
my $port = '22'; # 監視するポート
my $ipaddr = "";
my $paddr = "";

eval {
        local $SIG{ALRM} = sub { die "timeout"};
        alarm 2;
        my $protocol = getprotobyname('tcp');
        my $ipaddr = inet_aton($ARGV[0]) or die "$hostnameの取得失敗:$!";

        socket(SOCKET, PF_INET, SOCK_STREAM, $protocol) or die "socket失敗:$!";
        my $paddr = pack_sockaddr_in($port, $ipaddr);

        if (connect(SOCKET, $paddr)) {
                print "0";
        } else {
                print "1";
        }

        alarm 0;
};

if($@) {  # 例外処理
        if($@ =~ /timeout/) {
            print "1";
        }
}

TIPS:
使う人も少ないだろうけど、念のため記述。

my $hostname = '$ARGV[0]';
監視対象のサーバのIPアドレス、または解決できる名前を引数で取る
my $port = '22'; # 監視するポート
監視したい対象ポート(変更すれば好きなポートを監視可能)
eval {
    local $SIG{ALRM} = sub { die "timeout"};
alarm 2;
監視する対象ポートのタイムアウト値を指定
ここでは2秒
「timeout」の文字列はif($@)に入れられる文字列なので揃えること

最終的にスクリプトを実行し、「0」を返せば正常。
「1」を返せば異常とする。





※以下決して真似しないこと!!!!
間違ってるし、うまく動いていない!


実用的なことは何もないが、perlの勉強に。

#!/usr/bin/perl

use Socket;
use strict;

my $hostname = '$ARGV[0]';
my @port_list = (22); # 監視するポート
my $protocol = getprotobyname('tcp');
my $ipaddr = inet_aton($ARGV[0]) or die "$hostnameの取得失敗:$!";

foreach my $port (@port_list) {
socket(SOCKET, PF_INET, SOCK_STREAM, $protocol) or die "socket失敗:$!";
my $paddr = pack_sockaddr_in($port, $ipaddr);
if (connect(SOCKET, $paddr)) {
print "0\n";
} else {
print "1\n";
close SOCKET or die "close失敗:$!";
}

TIPS:
ssh(22番ポート)の死活監視。サーバが中途半端に死んだときに気づくことができる。
引数に指定したサーバ(文字列)にたいしてsshコネクションを試し、生きていたら0、死んでいたら1を返す。

勉強にしては少し難しかったが慣れるという意味で初めてperlで作ったスクリプト。


トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2015-12-22 (火) 15:01:47 (644d)