免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3680 | 回复: 5
打印 上一主题 下一主题

请教一个用perl写监控另外一台WEB服务器是否运行正常的脚本 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-08-21 10:37 |只看该作者 |倒序浏览
对perl不熟悉, 却要在一台只能运行perl脚本的机器上去监控另外一台WEB服务器是否运行正常。
哪位可以帮帮说说。

论坛徽章:
0
2 [报告]
发表于 2009-08-21 12:25 |只看该作者
  1. #!/usr/bin/perl
  2. use IO::Socket;
  3. use IO::File;
  4. use MIME::Base64;

  5. ##############################
  6. # Constant define (configure)
  7. ##############################
  8. # mail config
  9. use constant MAIL_ADDR       => ('to'=>'webmaster@example.com', 'from'=>'webmaster@example.com');
  10. use constant SMTP_INFO       => ('host'=>'smtp.example.com', 'user'=>'webmaster', 'password'=>'pass',
  11.                                  'debug'=>1, 'bufsize'=>1024);
  12. # common config
  13. use constant MD5SUM_FILE        => '/tmp/__monitor_md5sum_hash';
  14. use constant APACHE_LOG_PATH => '/usr/local/apache2/logs/access';
  15. # apache
  16. use constant APACHE_PORT        => 80;
  17. use constant APACHE_SERVERS     => ('web1.example.com', 'web2.example.com');
  18. # mysql
  19. use constant MYSQL_PORT       => 3306;
  20. use constant MYSQL_SERVERS    => ('db1.example.com', 'db2.example.com');
  21. # memcache
  22. use constant MEMCACHE_PORT    => 11211;
  23. use constant MEMCACHE_SERVERS => ('cache1.example.com', 'cache2.example.com');
  24. # search
  25. use constant SEARCH_PORT        => 8000;
  26. use constant SEARCH_SERVERS     => ('search1.example.com');


  27. ##############################
  28. # Server port is alive check
  29. ##############################
  30. sub check_server_alive {
  31. my($server, $port) = @_;

  32. $sock = IO::Socket::INET->new(PeerAddr=>$server, PeerPort=>$port, Proto=>'tcp', Timeout=>3);
  33. if (!$sock){
  34.        return 0;
  35. }
  36. $sock->close();
  37. return 1;
  38. }

  39. ##############################
  40. # Check process is exist
  41. ##############################
  42. sub check_process_exist {
  43. my $proc_name = shift;
  44. $line = `/bin/ps auxw | /bin/grep $proc_name | /bin/grep -v grep | /usr/bin/wc -l`;
  45. $line =~ s/^s+|s+$//g;
  46. if ($line == 0){
  47.        return 0;
  48. }
  49. return 1;
  50. }

  51. ##############################
  52. # Check file md5 fingerprint
  53. ##############################
  54. sub check_file_md5sum {
  55. my $io, $line;
  56. $filename = shift;
  57. @arr = split(/s/, `/usr/bin/md5sum $filename`);
  58. $filehash = shift(@arr);
  59. $io = IO::File->new();
  60. $io->open(MD5SUM_FILE, O_RDWR);
  61. if (!($line = $io->getLine())){
  62.        $io->syswrite($filehash);
  63.        $io->close;
  64.        return true;
  65. }
  66. if ($line != $filehash){
  67.        $io->truncate(0);
  68.        $io->syswrite($filehash);
  69.        $io->close;
  70.        return true;
  71. }
  72. return true;
  73. }

  74. ##############################
  75. # SMTP execute command
  76. ##############################
  77. sub smtp_cmd {
  78. my ($sock, $cmd, $blocking) = @_;
  79. my %smtpinfo = SMTP_INFO;
  80. my $buf, $bufsize = $smtpinfo{'bufsize'}, $debug=$smtpinfo{'debug'};

  81. $sock->syswrite($cmd);
  82. if ($debug == 1){
  83.        print ">>> $cmd ";
  84. }
  85. if ($blocking == 1){
  86.        $sock->sysread($buf, $bufsize);
  87.        if ($debug){
  88.          print "<<< $buf";
  89.        }
  90. }
  91. }

  92. ##############################
  93. # Send notice mail
  94. ##############################
  95. sub send_mail {
  96. my ($subject, $content) = @_;
  97. my $sock;
  98. my %mailaddr = MAIL_ADDR;
  99. my %smtpinfo = SMTP_INFO;
  100. my $debug = $smtpinfo{'debug'};

  101. # Count date time
  102. ($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());
  103. $datetime = sprintf("%s-%s-%s %s:%s:%s", "20".substr($year,1,2), length($mon)==1?"0$mon":$mon, length($day)==1?"0$day":$day, length($hour)==1?"0$hour":$hour, length($min)==1?"0$min":$min, length($sec)==1?"0$sec":$sec);
  104. $subject .= "[$datetime]";

  105. # Connect to SMTP server
  106. $sock = IO::Socket::INET->new(PeerAddr=>$smtpinfo{'host'}, PeerPort=>25, Proto=>'tcp', Timeout=>10);
  107. $sock->blocking(1);

  108. # Send smtp command
  109. if ($debug == 1){
  110.        print "<<< ". $sock->sysread($buf, $smtpinfo{'bufsize'});
  111. }
  112. smtp_cmd($sock, "HELO locahost ", 1);
  113. smtp_cmd($sock, "AUTH LOGIN ", 1);
  114. smtp_cmd($sock, encode_base64($smtpinfo{'user'}), 1);
  115. smtp_cmd($sock, encode_base64($smtpinfo{'password'}), 1);
  116. smtp_cmd($sock, "MAIL FROM: <". $mailaddr{'from'} ."> ", 1);
  117. smtp_cmd($sock, "RCPT TO: <". $mailaddr{'to'} ."> ", 1);
  118. smtp_cmd($sock, "DATA ", 1);
  119. smtp_cmd($sock, "From: ". $smtpinfo{'from'} ." ", 0);
  120. smtp_cmd($sock, "To: ". $smtpinfo{'to'} ." ", 0);
  121. smtp_cmd($sock, "Subject: $subject ", 0);
  122. smtp_cmd($sock, "$content ", 0);
  123. smtp_cmd($sock, " . ", 1);
  124. smtp_cmd($sock, "QUIT ", 0);
  125. $sock->close();

  126. return 1;
  127. }

  128. ##############################
  129. # Check server alive main
  130. ##############################
  131. sub monitor_main {
  132. # check apache
  133. foreach $item (APACHE_SERVERS) {
  134.        if (!check_server_alive($item, APACHE_PORT)) {
  135.          send_mail("$item apache server is down", "$item apache server is down. please timely restoration");
  136.        }
  137. }
  138. # check mysql
  139. foreach $item (MYSQL_SERVERS) {
  140.        if (!check_server_alive($item, MYSQL_PORT)) {
  141.          send_mail("$item mysql server is down", "$item mysql server is down. please timely restoration");
  142.        }
  143. }
  144. # check memcache
  145. foreach $item (MEMCACHE_SERVERS) {
  146.        if (!check_server_alive($item, MEMCACHE_PORT)) {
  147.          send_mail("$item memcache server is down", "$item memcache server is down. please timely restoration");
  148.        }
  149. }
  150. # check search
  151. foreach $item (SEARCH_SERVERS) {
  152.        if (!check_server_alive($item, SEARCH_PORT)) {
  153.          send_mail("$item search server is down", "$item search server is down. please timely restoration");
  154.        }
  155. }
  156. }


  157. ##############################
  158. # Main running
  159. ##############################

  160. monitor_main();
复制代码

[ 本帖最后由 Perl_Er 于 2009-8-21 12:27 编辑 ]

论坛徽章:
1
辰龙
日期:2014-05-15 19:37:15
3 [报告]
发表于 2009-08-21 12:26 |只看该作者
版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
[url]http://imaginaryboy.blogbus.com/logs/44036265.html[/url]

#!/usr/bin/perl
use strict;
use HTTP::SimpleLinkChecker;

my $url;
my $code;
print "Please input the target url(start with \"http\"):\n";
chomp($url = <STDIN>);
$code = HTTP::SimpleLinkChecker::check_link($url);
print "The $url response code is $code\n";



#Below is the meaning of the response code of http

(100)          HTTP_CONTINUE
(101)          HTTP_SWITCHING_PROTOCOLS
(102)          HTTP_PROCESSING
(200)          HTTP_OK
(201)          HTTP_CREATED
(202)          HTTP_ACCEPTED
(203)          HTTP_NON_AUTHORITATIVE_INFORMATION
(204)          HTTP_NO_CONTENT
(205)          HTTP_RESET_CONTENT
(206)          HTTP_PARTIAL_CONTENT
(207)          HTTP_MULTI_STATUS
(300)          HTTP_MULTIPLE_CHOICES
(301)          HTTP_MOVED_PERMANENTLY
(302)          HTTP_FOUND
(303)          HTTP_SEE_OTHER
(304)          HTTP_NOT_MODIFIED
(305)          HTTP_USE_PROXY
(307)          HTTP_TEMPORARY_REDIRECT
(400)          HTTP_BAD_REQUEST
(401)          HTTP_UNAUTHORIZED
(402)          HTTP_PAYMENT_REQUIRED
(403)          HTTP_FORBIDDEN
(404)          HTTP_NOT_FOUND
(405)          HTTP_METHOD_NOT_ALLOWED
(406)          HTTP_NOT_ACCEPTABLE
(407)          HTTP_PROXY_AUTHENTICATION_REQUIRED
(408)          HTTP_REQUEST_TIMEOUT
(409)          HTTP_CONFLICT
(410)          HTTP_GONE
(411)          HTTP_LENGTH_REQUIRED
(412)          HTTP_PRECONDITION_FAILED
(413)          HTTP_REQUEST_ENTITY_TOO_LARGE
(414)          HTTP_REQUEST_URI_TOO_LARGE
(415)          HTTP_UNSUPPORTED_MEDIA_TYPE
(416)          HTTP_REQUEST_RANGE_NOT_SATISFIABLE
(417)          HTTP_EXPECTATION_FAILED
(422)          HTTP_UNPROCESSABLE_ENTITY
(423)          HTTP_LOCKED
(424)          HTTP_FAILED_DEPENDENCY
(425)          HTTP_NO_CODE
(426)          HTTP_UPGRADE_REQUIRED
(449)          HTTP_RETRY_WITH
(500)          HTTP_INTERNAL_SERVER_ERROR
(501)          HTTP_NOT_IMPLEMENTED
(502)          HTTP_BAD_GATEWAY
(503)          HTTP_SERVICE_UNAVAILABLE
(504)          HTTP_GATEWAY_TIMEOUT
(505)          HTTP_HTTP_VERSION_NOT_SUPPORTED
(506)          HTTP_VARIANT_ALSO_NEGOTIATES
(507)          HTTP_INSUFFICIENT_STORAGE
(509)          HTTP_BANDWIDTH_LIMIT_EXCEEDED
(510)          HTTP_NOT_EXTENDED

[[i] 本帖最后由 iakuf 于 2009-8-21 12:27 编辑 [/i]]

论坛徽章:
0
4 [报告]
发表于 2009-08-21 12:56 |只看该作者

回复 #3 iakuf 的帖子

use HTTP::SimpleLinkChecker;

请问这个是PERL自带的吗
我运行后报错

Can't locate HTTP/SimpleLinkChecker.pm in @INC

论坛徽章:
1
2015年辞旧岁徽章
日期:2015-03-03 16:54:15
5 [报告]
发表于 2009-08-21 13:00 |只看该作者
原帖由 lxc521 于 2009-8-21 12:56 发表
use HTTP::SimpleLinkChecker;

请问这个是PERL自带的吗
我运行后报错

Can't locate HTTP/SimpleLinkChecker.pm in @INC

你就用 LWP::UserAgent 就可以了。

论坛徽章:
0
6 [报告]
发表于 2009-08-28 14:28 |只看该作者

回复 #5 flw 的帖子

可以通过检查title值来判断web服务器是否运行正常,特别是tomcat频繁异常的现象可以有效处理。
当title值检测不到时,可以重启tomcat来解决。还请各位指出不足。谢谢!
代码如下:
#!/usr/bin/perl -w


use strict;

use Net::HTTP;

my $s = Net::HTTP->new(Host =>"IP") || die $@;

$s->write_request(GET => "/", 'User-Agent' => "Mozilla/5.0");

my($code, $mess, %h) = $s->read_response_headers;

while (1) {
        my $buf;
        my $n = $s->read_entity_body($buf, 4096);
        die "read failed: $!" unless defined $n;
        last unless $n;
#       print $buf;

        if ($buf =~ /somthing(.*?)/) {
                print "Alive\n";
                last;
        } else {
                print "Dead\n";
        }
}
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP