[英]Perl regex in Nagios check
我對perl不熟悉,我有修改Nagios檢查的需要。 我很感激有關如何進行的任何建議。 我正在使用的支票是 check_smart,在這里找到:
https://www.claudiokuenzler.com/nagios-plugins/check_smart.php
此腳本可讓您檢查硬盤驅動器中的 SMART 值,並以簡單的形式顯示結果以進行監控。 就目前而言,腳本可以采用 /dev/sd[ac] 形式的正則表達式作為選項之一; 我相信這是允許這樣做的部分:
# 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] - Device is clean --- [/dev/sdb] - Device is clean --- [/dev/sdc] - Device is干凈的
編輯:這是設置 $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
,與您的$opt_d
,這是兩個單獨的變量。
從if
語句中,如果$opt_d
未設置(即沒有為腳本提供任何設備名稱以進行操作),則使用$opt_g
的值調用glob
並且實際上是glob
根據以下內容找出所有文件名$opt_g
給出的正則表達式。
在這個if
語句之后, @dev
數組被歸檔了要處理的設備名稱。
然后你有一個foreach
語句,這意味着@dev
數組中的每個項目都有一個循環。 在循環期間,每個項目都在$opt_dl
變量中,因為它在foreach
語句中使用。
但是,我無法理解您在最后一段中想做什么。
我是 check_smart 的維護者,有趣的是我現在不小心偶然發現了這個問題。
我不太明白為什么變量是 $opt_dl,而早些時候它似乎是 $opt_d。 然而,結果是腳本返回如下內容: OK: [/dev/sda] - Device is clean --- [/dev/sdb] - Device is clean --- [/dev/sdc] - Device is干凈的
所以基本上當你使用-g
參數時,你告訴 check_smart 插件使用 glob ( https://perldoc.perl.org/functions/glob.html ) - 這與正則表達式不同。 匹配 glob 表達式的驅動器(例如-d '/dev/sd[az]
)將創建一個列表( $opt_dl
)並且插件將在 for 循環中運行每個驅動器。
具體來說,我希望能夠傳遞類似於“megaraid,[5-8]”的腳本,並讓它為每個腳本運行。 在這種情況下,我不會傳遞設備的正則表達式,它只是 /dev/sda。
自 5.0 版(於 2014 年 4 月發布,在您提出問題之前;-))以來,這已經成為可能。 您只需要更改語法。 不是在-d
上使用 glob 表達式,而是在接口參數 ( -i
) 上使用它。 實際示例: -i 'megaraid,[5-8]'
。
自最新版本(6.6,幾天前發布)以來,多個驅動器檢查(使用-g
)和硬件存儲/raid 控制器的輸出略有變化,現在指示接口的設備 ID 而不是邏輯驅動器路徑:
# ./check_smart.pl -g /dev/sda -i 'megaraid,[1-3]'
OK: [megaraid,1] - Device is clean --- [megaraid,2] - Device is clean --- [megaraid,3] - Device is clean|
這在官方文檔中也有描述。
更多信息: https : //www.claudiokuenzler.com/monitoring-plugins/check_smart.php https://www.claudiokuenzler.com/blog/914/check_smart-6.6-multiple-drives-check-megaraid-3ware-cciss-控制器
我希望這能回答你的問題,盡管我可能晚了兩年。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.