【发布时间】:2017-06-21 08:13:09
【问题描述】:
我不熟悉 perl,我需要修改 Nagios 检查。我将不胜感激有关如何进行的任何建议。我使用的检查是 check_smart,在这里找到:
https://www.claudiokuenzler.com/nagios-plugins/check_smart.php
此脚本可让您检查硬盘驱动器的 SMART 值并以简单的形式显示结果以进行监控。就目前而言,脚本可以采用 /dev/sd[a-c] 形式的正则表达式作为选项之一;我相信这是允许这样做的部分:
# list of devices for a loop
my(@dev);
if ( $opt_d ){
# normal mode - push opt_d on the list of devices
push(@dev,$opt_d);
} else {
# glob all devices - try '?' first
@dev =glob($opt_g);
}
foreach my $opt_dl (@dev){
warn "Found $opt_dl\n" if $opt_debug;
if (-b $opt_dl || -c $opt_dl){
$device .= $opt_dl.":";
} else {
warn "$opt_dl is not a valid block/character special device!\n\n" if $opt_debug;
}
}
我不太明白为什么变量是 $opt_dl,而之前它似乎是 $opt_d。然而,结果是脚本返回如下内容: OK: [/dev/sda] - 设备干净 --- [/dev/sdb] - 设备干净 --- [/dev/sdc] - 设备干净
编辑:这是设置 $opt_d 的代码;进一步思考,似乎 $opt_dl 只是 $opt_d 而它处于循环中或其他什么东西?
use vars qw($opt_b $opt_d $opt_g $opt_debug $opt_h $opt_i $opt_v);
Getopt::Long::Configure('bundling');
GetOptions(
"debug" => \$opt_debug,
"b=i" => \$opt_b, "bad=i" => \$opt_b,
"d=s" => \$opt_d, "device=s" => \$opt_d,
"g=s" => \$opt_g, "global=s" => \$opt_g,
"h" => \$opt_h, "help" => \$opt_h,
"i=s" => \$opt_i, "interface=s" => \$opt_i,
"v" => \$opt_v, "version" => \$opt_v,
);
我想以类似方式更改的代码部分是:
# Allow all device types currently supported by smartctl
# See http://www.smartmontools.org/wiki/Supported_RAID-Controllers
if ($opt_i =~ m/(ata|scsi|3ware|areca|hpt|cciss|megaraid|sat)/) {
$interface = $opt_i;
} else {
print "invalid interface $opt_i for $opt_d!\n\n";
print_help();
exit $ERRORS{'UNKNOWN'};
}
具体来说,我希望能够传递类似“megaraid,[5-8]”之类的脚本并让它为每个脚本运行。在这种情况下,我不会传递设备的正则表达式,它只是 /dev/sda。
如果有人能就此提供建议,我将不胜感激!
【问题讨论】:
-
如果没有看到设置它的代码,就很难评论
$opt_d。$opt_dl用于迭代@dev数组,我猜它包含设备列表。 -
感谢您的回复,我已经编辑了帖子以显示如何设置 $opt_d。