#!/usr/local/bin/perl #!D:/Perl/bin/perl.exe # SSI表示用サーバー稼動時間計測Perlスクリプト(IO::Socketモジュール使用例) # SOCKETsvrchk3.pl 2006.02.25 作成:鷹の巣 http://sakaguch.com/ # 参考URL # http://doppo.no-ip.com/j-serv/s_check/s_check.htm # http://www.dream-seed.com/linux/svrck.html # 説明が豊富なURL:http://x68000.q-e-d.net/~68user/net/http-2.html # 説明が豊富なURL:http://ash.or.jp/perl/socket_http.htm # このスクリプトは、utf-8コードで書かれています。 # windowsのコマンドプロンプト画面から実行する場合は、terapad等のエディタで、 # shift-jisコードに「文字/改行コード指定保存」して実行して下さい。 #■□■ URLの設定 ■□■ my $url = 'http://127.0.0.1/'; # アクセスするURL my $timeout = 60; # 接続待ち許容時間(秒) # ■ 監視時間間隔(秒) my $check_interval = 3600; # ■ 監視時間ファイル名 # WebサーバーのSSIで表示できるフォルダに作成すること。 my $SSI_Data_file = "D:/www/ssi_data/run_time.txt"; #■□■ 設定終わり ■□■ use IO::Socket; # IO::Socketモジュールを使用 &main(); # perlで、URLを閲覧 exit; sub main { $| = 1; # バッファリングしない # 起動時に前回までの稼働時間を読込む。 open(IN, "< $SSI_Data_file") || die "$SSI_Data_fileオープンエラー 空ファイルを作って下さい。\n"; $run_time = ; close(IN); # 無限ループ for (;;){ $start_time = time(); $next_time = $start_time + $check_interval; # サーバーの稼動検査を実施して、する。 # $urlに設定したURLのWebページを標準出力(HTTPクライアント) $message = &svrchk($url,$timeout); if ($message =~ "接続できません") { $run_time = 0 ; } else { $run_time++ ; } # デバッグ用に表示 print "$message サーバーの稼動時間は、$run_time時間です。\n"; # 稼働時間を記録する。 open(OUT, "> $SSI_Data_file") || die "$SSI_Data_fileオープンエラー フォルダがないかフォルダのアクセス権を変更して下さい。\n"; print (OUT "$run_time"); close(OUT); # 余った時間、処理を休止する。(60秒毎に検査) while (time() < $next_time) { sleep (60); } } } sub svrchk { my ($url ,$timeout) = @_; # 引数0:URI、引数1:接続待ち許容時間(秒) $url =~ /(http:)?(\/\/)?([^:\/]*)?(:([0-9]+))?(\/.*)?/; my $host = $3; if ($host eq "") {$host = 'localhost';} my $port = $5; if ($port eq "") {$port = 80;} # HTTPプロトコルgetservbyname('http','tcp')は80。 my $mes = ""; # 戻り値の初期化 my $SOCKET = IO::Socket::INET -> new(PeerAddr => $host, # HTTPプロトコルでWWWサーバーへ接続する PeerPort => $port, # サービスポート番号 Proto => "tcp", # プロトコル Timeout => $timeout,# 接続待ち許容時間(秒) ); if ($SOCKET) { print $SOCKET "OPTIONS * HTTP/1.0\r\n"; # WWWサーバにOPTIONSメソッドを送る print $SOCKET "\r\n"; $SOCKET -> flush(); # バッファに溜まっているデータも送る # while (<$SOCKET>){ m/^\r\n$/ and last; } # ヘッダ部分を除去する(改行のみの行ならループを抜ける) # print <$SOCKET>; # HTTP応答を(ヘッダも含めて)受信して表示 if(<$SOCKET> =~ /^HTTP\//){ $mes = "正常な応答です。"; } else { $mes = "応答は、ありましたが内容が不正です。"; } $SOCKET -> close(); # WWWサーバーから切断する } else { $mes = "$hostのポート$portに接続できません。"; } return ($mes); # 戻り値を格納。 }