Re: [問題] 關於一支無限迴圈的程式

看板Perl作者 (淺龍勿用)時間18年前 (2007/10/02 12:54), 編輯推噓1(101)
留言2則, 1人參與, 最新討論串2/4 (看更多)
※ 引述《wnick (淺龍勿用)》之銘言: : 我用PREL寫了一支無限迴圈的程式 : 用SNMP去取得一些SWITCH的資訊 : 但是程式會常常當掉 : 有什麼要注意的嗎? : 不知道需不需要附上程式碼? #! /usr/bin/perl -w eval '(exit $?0)' && eval 'exec /usr/bin/perl $0 ${1+"$@"}' && eval 'exec /usr/bin/perl $0 $argv:q' if 0; use strict; use DBI; use Net::SNMP qw(snmp_dispatcher oid_lex_sort); my $dbh = DBI->connect("dbi:mysql:database=dorm;host=*.*.*.*", "guest", "guest") or die $DBI::errstr; #my @HOST_OID = qw(1.3.6.1.2.1.2.2.1.10.4227626 1.3.6.1.2.1.2.2.1.10.4227634 1.3.6.1.2.1.2.2.1.10.4227642 1.3.6.1.2.1.2.2.1.10.4227650 1.3.6.1.2.1.2.2.1.10.4227658 1.3.6.1.2.1.2.2.1.10.4227666 1.3.6.1.2.1.2.2.1.10.4227674 1.3.6.1.2.1.2.2.1.10.4227682 1.3.6.1.2.1.2.2.1.10.4227690 1.3.6.1.2.1.2.2.1.10.4227698 1.3.6.1.2.1.2.2.1.10.4227706 1.3.6.1.2.1.2.2.1.10.4227714 1.3.6.1.2.1.2.2.1.10.4227722 1.3.6.1.2.1.2.2.1.10.4227730 1.3.6.1.2.1.2.2.1.10.4227738 1.3.6.1.2.1.2.2.1.10.4227746 1.3.6.1.2.1.2.2.1.10.4227754 1.3.6.1.2.1.2.2.1.10.4227762 1.3.6.1.2.1.2.2.1.10.4227770 1.3.6.1.2.1.2.2.1.10.4227778 1.3.6.1.2.1.2.2.1.10.4227786 1.3.6.1.2.1.2.2.1.10.4227794 1.3.6.1.2.1.2.2.1.10.4227802 1.3.6.1.2.1.2.2.1.10.4227810 1.3.6.1.2.1.2.2.1.10.4228041 1.3.6.1.2.1.2.2.1.10.4228049 1.3.6.1.2.1.2.2.1.10.4228057 1.3.6.1.2.1.2.2.1.10.4228065); my @OID = qw(4227626 4227634 4227642 4227650 4227658 4227666 4227674 4227682 4227690 4227698 4227706 4227714 4227722 4227730 4227738 4227746 4227754 4227762 4227770 4227778 4227786 4227794 4227802 4227810 4228041 4228049 4228057 4228065); my @HOSTS = qw(10.0.236.115 10.0.236.116 10.0.236.117 10.0.236.118 10.0.236.245 10.0.236.246 10.0.236.247 10.0.236.248 10.0.237.115 10.0.237.116 10.0.237.117 10.0.237.118 10.0.237.245 10.0.237.246 10.0.237.247 10.0.237.248 10.0.238.115 10.0.238.116 10.0.238.117 10.0.238.118 10.0.238.245 10.0.238.246 10.0.238.247 10.0.238.248 10.0.239.115 10.0.239.116 10.0.239.117 10.0.239.118 10.0.239.245 10.0.239.246 10.0.239.247 10.0.239.248 10.0.240.115 10.0.240.116 10.0.240.117 10.0.240.118 10.0.240.119 10.0.240.245 10.0.240.246 10.0.240.247 10.0.240.248 10.0.241.115 10.0.241.116 10.0.241.117 10.0.241.118 10.0.241.245 10.0.241.246 10.0.241.247 10.0.241.248 10.0.242.115 10.0.242.116 10.0.242.117 10.0.242.118 10.0.242.245 10.0.242.246 10.0.242.247 10.0.242.248 10.0.245.115 10.0.245.116 10.0.246.115 10.0.246.116 10.0.246.117 10.0.246.118 10.0.246.119 10.0.246.120 10.0.246.121 10.0.246.245 10.0.246.246 10.0.246.247 10.0.246.248 10.0.246.249 10.0.247.115 10.0.247.116 10.0.247.117 10.0.247.118 10.0.247.119 10.0.247.120 10.0.247.245 10.0.247.246 10.0.247.247 10.0.247.248 10.0.247.249 10.0.247.250 10.0.248.115 10.0.248.116 10.0.248.117 10.0.248.118 10.0.248.119 10.0.248.120 10.0.248.121 10.0.249.115 10.0.249.116 10.0.249.117 10.0.249.118 10.0.249.119 10.0.249.245 10.0.249.246 10.0.249.247 10.0.249.248); my $ifOutTable = '1.3.6.1.2.1.31.1.1.1.10'; my $ifInTable = '1.3.6.1.2.1.31.1.1.1.6'; my $result_in; my $result_out; my %host_time; my $sth_update; my $value_in; my $value_out; my $du_time; my $b_time; my $nowtime; my $error_time; my $host; my $conter_max = 18446744073709551615; my $b_value; my $n_value; my $dutime; my $avg; while(1){ $nowtime = time; foreach $host (@HOSTS){ #printf("======= %s =======", $host); # Create the SNMP session my ($session, $error) = Net::SNMP->session( -hostname => $host, -community => 'public', -port => 161, -version => 'snmpv2c' ); # Was the session created? if (!defined($session)) { $error_time = localtime; printf("ERROR: %s. TIME:%s\n", $error, $error_time); #exit 1; } if (defined($result_in = $session->get_table(-baseoid => $ifInTable)) && defined($result_out = $session->get_table(-baseoid => $ifOutTable))) { $nowtime = time; if (exists $host_time{$host}) { $b_time = $host_time{$host}; $du_time = ($nowtime - $b_time); } else{ $du_time = 0; } $host_time{$host} = $nowtime; my $sth = $dbh->prepare("SELECT s_port, in_octets, in_max, out_octets, out_max FROM dorm_flow WHERE s_ip = '$host'"); $sth->execute(); while (my @db_result = $sth->fetchrow_array) { my $get_in = '1.3.6.1.2.1.31.1.1.1.6.' . $db_result[0]; my $get_out = '1.3.6.1.2.1.31.1.1.1.10.' . $db_result[0]; $value_in = $result_in->{$get_in}; $value_out = $result_out->{$get_out}; if($du_time == 0){ $sth_update = $dbh->prepare("UPDATE dorm_flow SET in_octets = '$value_in', in_avg = 0, out_octets = '$value_out', out_avg = 0 WHERE s_ip = '$host' AND s_port = '$db_result[0]'"); $sth_update->execute(); } else{ my $in_avg = &avg($db_result[1], $value_in, $du_time); my $out_avg = &avg($db_result[3], $value_out, $du_time); #update to DB if ($in_avg > $db_result[2] && $out_avg > $db_result[4]){ $sth_update = $dbh->prepare("UPDATE dorm_flow SET in_octets = '$value_in', in_avg = '$in_avg', in_max = '$in_avg', out_octets = '$value_out', out_avg = '$out_avg', out_max = '$out_avg' WHERE s_ip = '$host' AND s_port = '$db_result[0]'"); $sth_update->execute(); } elsif ($in_avg > $db_result[2]){ $sth_update = $dbh->prepare("UPDATE dorm_flow SET in_octets = '$value_in', in_avg = '$in_avg', in_max = '$in_avg', out_octets = '$value_out', out_avg = '$out_avg' WHERE s_ip = '$host' AND s_port = '$db_result[0]'"); $sth_update->execute(); } elsif ($out_avg > $db_result[4]){ $sth_update = $dbh->prepare("UPDATE dorm_flow SET in_octets = '$value_in', in_avg = '$in_avg', out_octets = '$value_out', out_avg = '$out_avg', out_max = '$out_avg' WHERE s_ip = '$host' AND s_port = '$db_result[0]'"); $sth_update->execute(); } else{ $sth_update = $dbh->prepare("UPDATE dorm_flow SET in_octets = '$value_in', in_avg = '$in_avg', out_octets = '$value_out', out_avg = '$out_avg' WHERE s_ip = '$host' AND s_port = '$db_result[0]'"); $sth_update->execute(); } } } } else{ $error_time = localtime; printf("ERROR: %s. TIME:%s\n\n", $session->error(), $error_time); } $session->close; } sleep(264); } sub avg{ if ($_[1] < $_[0]){ $avg = (($_[1] + ($conter_max - $_[0]))/$_[2]); } else{ $avg = (($_[1] - $_[0])/$_[2]); } } __END__ 這樣大家看得懂嗎>\\\< -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.134.21.191

10/02 23:05, , 1F
你可以先貼到這裡嗎 http://src.wtgstudio.com/
10/02 23:05, 1F

10/02 23:05, , 2F
然後把link給我們
10/02 23:05, 2F
文章代碼(AID): #170SyHHj (Perl)
文章代碼(AID): #170SyHHj (Perl)