我對Perl不熟悉,我需要修改Nagios檢查。我會很感激任何關於如何進行的建議。我使用的檢查是check_smart,發現這裏:Nagios檢查中的Perl正則表達式
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'數組,我猜想它保存着設備列表。 – codeforester
感謝您的回覆,我已編輯帖子以顯示$ opt_d是如何設置的。 – user2792137