投稿日:2002年04月01日 作成鷹の巣

No.2238 WEBサーバー稼動チェックスクリプト・Linux版(長文注意)



WEBサーバー稼動チェックスクリプト・Linux版(長文注意)

No.2238 投稿時間:2002年04月01日(Mon) 10:53 投稿者名:水芹 URL:http://www.dream-seed.com

水芹です。

話題になっているWebサーバ稼動チェックプログラムですが、
Linuxユーザーが取り残されると寂しいので簡単なPerlスクリプトを
作ってみました。
葛飾独歩さんのプログラムより機能が少ないと思いますが、ほぼ同様な
ことが出来るのでは?と思います。
ただデーモン動作なんてしませんので、cronで定期的に実行する必要があります(^^;

おまけで、ローカルを監視している場合にApacheの反応がない場合は、再起動をかけるように
してみました(この場合はrootで実行する必要があります)。
実行にはjcode.pl、base64.plが必要です(base64の方はモジュールを使ってもいいと思います)。
一応、動作チェックはしましたが、不備・不具合があるかもしれません。
Linuxサーバーの方で動作チェックをして頂けたらと思います。
また、ここが変というところがあったら指摘していただけるとうれしいです。

---------------------------------------------------------------------------------------
#!/usr/bin/perl

use IO::Socket;
require '/home/httpd/html/jcode.pl';
require '/home/httpd/html/base64.pl';

# ■ チェック対象サーバー サーバー名:ポート:管理者アドレス
$SERVERS = 'localhost:80:tatuya@dream-seed.com,
www.yahoo.co.jp:80:tatuya@dream-seed.com';

# ■ WEBサーバー再起動コマンド
$CmdReStart = "/etc/rc.d/init.d/httpd restart";

# ■ メールの送信者
$from = 'tatuya@dream-seed.com';

# ■ メールのSubject
$subject = "サーバー監視サービス(Dream-Seed)";

# ■ メールにつける署名
$SIN=<<"_mail_";
サーバー監視サービス
http://www.dream-seed.com
tatuya\@dream-seed.com
_mail_

# ■ sendmailのパス
$sendmail = '/usr/sbin/sendmail';

# ■ ログファイル(実行ユーザーでの書き込み権限が必要)
$logfile = "/home/httpd/html/svrchk.log";

# ■ 現在時刻の取得
@date = localtime(time);
$date[5] += 1900;
$date_now = sprintf("%04d\-%02d\-%02d %02d:%02d:%02d",$date[5],$date[4]+1,$date[3],$date[2],$date[1],$date[0]);

#---------------------------------------
# サーバー動作状態のチェック
#---------------------------------------
@SERVERS = split(/,/,$SERVERS);
foreach (@SERVERS){
($SERVER,$PORT,$MAIL) = split(/:/,$_);
$SERVER =~ s/(\r\n|\r|\n|\t| )//g;
$SOCKET = IO::Socket::INET->new("$SERVER:$PORT");
if(!$SOCKET){ &Chek(1,$SERVER,$MAIL); next; }
print $SOCKET "OPTIONS / HTTP/1.0\r\n";
print $SOCKET "\r\n";
$SOCKET->flush();
$res = <$SOCKET>;
if($res =~ /^HTTP\//){
&Chek(0,$SERVER,$MAIL);
} else {
&Chk(1,$SERVER,$MAIL);
}
}
#---------------------------------------
# 前回のサーバー動作状態のチェック
#---------------------------------------
sub Chek {
my($CODE,$SERVER,$MAIL) = @_;
@NEW_LOG = "";

open(IN,"$logfile");
@LOG = <IN>;
close(IN);

$flag = 0;
foreach (@LOG){
($i,$server_name,$status) = split(/\t/,$_);
if($SERVER eq $server_name){
$flag = 1;
if($CODE == 0){
if($status eq "NG") {
$value = "$date_now\t$SERVER\tOK\t\n";
unshift(@NEW_LOG,$value);
&SendMail(1,$SERVER,$MAIL);
} else {
unshift(@NEW_LOG,$_);
}
}
elsif($CODE == 1){
if($status eq "OK") {
$value = "$date_now\t$SERVER\tNG\t\n";
unshift(@NEW_LOG,$value);
&SendMail(2,$SERVER,$MAIL);
} else {
unshift(@NEW_LOG,$_);
}
}
} else {
unshift(@NEW_LOG,$_);
}
}

if(!$CODE and !$flag){
$value = "$date_now\t$SERVER\tOK\t\n";
unshift(@NEW_LOG,$value);
&SendMail(0,$SERVER,$MAIL);
}

open(OUT,">$logfile");
print OUT @NEW_LOG;
close(OUT);

if($CODE and $SERVER eq "localhost"){
system($CmdReStart);
}
}
#--------------------------------------
# メール送信
#--------------------------------------
sub SendMail {
my($code,$SERVER,$TO) = @_;
$subject = &jis("$subject");
$subject = &base64::b64encode($subject);
chomp($subject);
$subject = "=?ISO-2022-JP?B?$subject?=";

if($from =~ /(.+)<(.+)>/) {
$from_addr = $2;
$from_top = $1;
$from_top = &jis($from_top);
$from_top = &base64::b64encode($from_top);
chomp($from_top);
$from = "=?ISO-2022-JP?B?$from_top?=<$from_addr>";
}
else { $from_addr = $from; }

$MSG[0] = "$SERVERを新たに監視対象として登録しました\n";
$MSG[1] = "$SERVERの復旧を確認しました\n";
$MSG[2] = "$SERVERの動作を確認できませんでした。\n";

$message = $MSG[$code].$SIN;
$message = &jis($message);

if (!open(OUT,"| $sendmail -t -oi -f $from_addr")) { die "sendmail can't open $!"; }
print OUT "To: $TO\n";
print OUT "From: $from\n";
print OUT "Subject: $subject\n";
print OUT "X-Mailer: svrchk.pl by dream-seed\n";
print OUT "MIME-Version: 1.0\n";
print OUT "Content-Transfer-Encoding: 7bit\n";
print OUT "Content-Type: text/plain\; charset=iso-2022-jp\n\n\n";
print OUT "$message\n";

close(OUT);
}
#---------------------------------------
# JIS変換
#---------------------------------------
sub jis {
$msg = $_[0];
&jcode::convert(*msg, 'jis');
return $msg;
}


ありがたい限りです。

No.2239 投稿時間:2002年04月01日(Mon) 12:41 投稿者名:NEO URL:http://www.missing.2y.net:8000/

おぉ!
ありがたい限りです。


ソース公開だし、素晴らしいです。

No.2266 投稿時間:2002年04月03日(Wed) 20:50 投稿者名:葛飾独歩 URL:http://doppo.no-ip.com/j-serv/

> 水芹です。
>
> 話題になっているWebサーバ稼動チェックプログラムですが、
> Linuxユーザーが取り残されると寂しいので簡単なPerlスクリプトを
> 作ってみました。
> 葛飾独歩さんのプログラムより機能が少ないと思いますが、ほぼ同様な
> ことが出来るのでは?と思います。
> ただデーモン動作なんてしませんので、cronで定期的に実行する必要があります(^^;

出てきましたねぇ。スクリプト版。お疲れ様です>水芹さん
ソース公開だし、素晴らしいです。
掲示板だと流れてしまうかもしれないので、勿体ないですね。
それにしても、Perlは良くワカリマセン(w

定期的動作と言えば、私はMRTGをwperlで5分おきに動作させてますが、
そういうやり方はできないのでしょうか?


私のサイトで解説しようかと思ってます

No.2268 投稿時間:2002年04月03日(Wed) 23:43 投稿者名:水芹 URL:http://www.dream-seed.com

> 掲示板だと流れてしまうかもしれないので、勿体ないですね。

もう少し手を加えてから、私のサイトで解説しようかと思ってます(^^;

> 定期的動作と言えば、私はMRTGをwperlで5分おきに動作させてますが、
> そういうやり方はできないのでしょうか?

一応可能です。

#---------------------------------------
# サーバー動作状態のチェック
#---------------------------------------
while<1>{ #<-この行を追加
@SERVERS = split(/,/,$SERVERS);
foreach (@SERVERS){


}
sleep 300; #<-この行を追加
}          #<-この行を追加
#---------------------------------------
# 前回のサーバー動作状態のチェック
#---------------------------------------

上記のように3行追加して、sleepのところで何秒おきに動作するか指定できます。

ただ自分で書いたスクリプトを信用していないので(笑)もしスクリプトが停止してしまった
場合などは気がつかない危険もあります。
cronデーモンが落ちるということは、そうそうないと思うのでcronが使えるならそっちの方が
いいかなぁっと思っていたりします。


解説、宜しくお願い致します。

No.2282 投稿時間:2002年04月05日(Fri) 09:10 投稿者名:鷹の巣 URL:http://sakaguch.com/

> > 掲示板だと流れてしまうかもしれないので、勿体ないですね。
>
> もう少し手を加えてから、私のサイトで解説しようかと思ってます(^^;


サイトでの解説、宜しくお願い致します。直リンクさせて下さいね。


スクリプトの解説と配布ページを作りました。

No.2303 投稿時間:2002年04月06日(Sat) 01:46 投稿者名:水芹 URL:http://www.dream-seed.com

水芹です。

スクリプトの解説と配布ページを作りました。
http://www.dream-seed.com/linux/svrck.html

おそらく問題ないと思いますが、設置方法がわからない、動作しないという
場合はご連絡いただければ調べます(^^;


リンクを張りました。

No.2309 投稿時間:2002年04月06日(Sat) 23:57 投稿者名:鷹の巣 URL:http://sakaguch.com/

> スクリプトの解説と配布ページを作りました。
> http://www.dream-seed.com/linux/svrck.html
>
> おそらく問題ないと思いますが、設置方法がわからない、動作しないという
> 場合はご連絡いただければ調べます(^^;


スクリプトの解説と配布ページの作成、ご苦労様です。
ここ
http://sakaguch.com/JyoujiSetsuzoku.html#ServerCheck
の白枠内の一番下からリンクを張りました。
(Perlのスクリプトですから、Linuxユーザー以外でも使用出来そうですね。WEBサーバー再起動コマンドは、apache用ですね。)


|目次|掲示板|過去ログ目次|▲頁先頭|