我在尝试使用使用Net :: SNMP的Nagios插件时遇到问题。它尝试同时查询大量OID,导致错误,因为响应将超过链路的最大MTU。 (消息大小2867超过maxMsgSize 1472.)
本节的代码如下:
$result = $session->get_request(
Varbindlist => \@oids
);
Perl中有没有办法
这是对脚本进行的最小修改,使其支持更大量的接口,对吗?
答案 0 :(得分:3)
1) Split @oids into smaller pieces
2) Iterate over these pieces
使用splice()将列表分解为更小的列表。如果你一次想要十个:
while (@oids) {
my @sublist = splice @oids, 0, 10;
# do something with the 10 (or less) elements in @sublist
}
答案 1 :(得分:0)
此代码未经测试,但我将其作为一般概念提供给您如何划分列表并与之一起运行。
my $divisions = int ( @oids / 10 );
my $offset = 0;
my @oids_list;
while ( $offset <= $#oids ) {
my $top = $offset + $divisions;
$top = $top <= $#oids ? $top : $#oids
push @oids_list, [ @oids[ $offset .. $top ] ];
$offset += $divisions + 1;
}
my @results;
foreach my $oids_ref ( @oids_list ) {
push @results, $session->get_request(
Varbindlist => $oids_ref
}
现在,如果我的计算结果正确,您将获得@results,这将是每次迭代$ session-&gt; get_request()的返回值列表。我不知道那是什么样的;也许你只是将它连接在一起。这是你要弄明白的一部分。 ;)