将数组拆分为块,在每个块上执行snmp_get_request,重新组合生成的哈希引用

时间:2011-06-11 04:35:20

标签: perl snmp nagios

我在尝试使用使用Net :: SNMP的Nagios插件时遇到问题。它尝试同时查询大量OID,导致错误,因为响应将超过链路的最大MTU。 (消息大小2867超过maxMsgSize 1472.)

本节的代码如下:

$result = $session->get_request(
   Varbindlist => \@oids
);

Perl中有没有办法

  1. 将@oids拆分为更小的部分
  2. 迭代这些作品
  3. 将返回的$ results结合到单个哈希的单个引用中?
  4. 这是对脚本进行的最小修改,使其支持更大量的接口,对吗?

2 个答案:

答案 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()的返回值列表。我不知道那是什么样的;也许你只是将​​它连接在一起。这是你要弄明白的一部分。 ;)