linux - Nagios 检查中的 Perl 正则表达式

标签 linux perl nagios

本人对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_dl 可能命名不当并且与您的 $opt_d 无关,它们是两个独立的变量。

if 语句中,如果 $opt_d 没有设置(即脚本没有被赋予任何设备名称来执行),那么 glob$opt_g 的值调用,实际上是 glob 根据 $opt_g 中给出的正则表达式找出所有文件名>.

在这个 if 语句之后,@dev 数组中包含要处理的设备的名称。

然后你有一个 foreach 语句,这意味着在 @dev 数组中的每个项目上循环。在循环期间,每个项目都在 $opt_dl 变量中,因为它在 foreach 语句中使用。

但是我无法理解你在最后一段中想要做什么。

关于linux - Nagios 检查中的 Perl 正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033016/

相关文章:

linux - Q文件对话框 : is it possible to filter only executables (under Linux)?

perl - 如何在 Perl 的 Term::Shell 中自定义制表符补全?

redis - Icinga2:在远程主机而不是主机上运行检查

regex - 无法将否定先行断言应用于 bash 上的 nagios 插件输出

java - Java中的Netcat通信

c - 填充结构的实际大小,(成员大小的总和,没有用于对齐的填充)

linux - 使用相同的配置和构建实现多个 jenkins

linux - 使用 Linux IMA 重新测量文件

perl - 如何从 makefile 运行 Perl one liner?

perl - 是否有搜索多余代码的模块?