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用ですね。)