我几乎完成了nagios插件,我正在使用本指南。我遇到了错误,我不知道为什么。
#!/bin/perl
use strict;
use warnings;
my $warn = 20;
my $crit = 50;
my $percent_down = 10;
my $percent_up = 90;
my $err = "error";
given ($percent_down) {
when ($percent_down lt $warn) { print "OK - $percent_up% UP"; exit 0;}
when ($percent_down ge $warn && lt $crit ) { print "WARNING - $percent_down% DOWN"; exit (1);}
when ($percent_down ge $crit) { print "CRITICAL - $percent_down% DOWN"; exit (2);}
default { print "UNKNOWN - $err "; exit (3);}
}
我得到语法错误从") {"
的given ($percent_down) {
开始,然后从之后的每一行的";}"
开始。
要使用given
,您需要
no if $] >= 5.018, warnings => "experimental::smartmatch";
use feature qw( switch );
也
$percent_down ge $warn && lt $crit
应该是
$percent_down ge $warn && $percent_down lt $crit
现在对于你没有问的问题。
lt
和ge
用于比较字符串。使用<
和>=
来比较数字。(例如,9 ge 10
为真。
最后,您不应该使用given
-when
.这是一项实验性功能,将来将以向后不兼容的方式删除或更改。
修复上述问题并删除冗余检查后,您将剩下以下内容:
if ($percent_down < $warn) {
print "OK - $percent_up% UP";
exit(0);
}
if ($percent_down < $crit) {
print "WARNING - $percent_down% DOWN";
exit(1);
}
print "CRITICAL - $percent_down% DOWN";
exit(2);
出于多种原因,建议您避免given
和when
。即使你正确地启用了该功能,你也会收到另一一系列警告消息,告诉你该功能是实验性的,无论如何你都没有使用该功能有用的设施——主要是智能匹配,这也是实验性的。
最终的when
块永远无法输入,因为上述条件涵盖了所有可能性
我建议您使用这样的if
elsif
else
序列编写它。我相信这样更易读
#!/bin/perl
use strict;
use warnings 'all';
my $warn = 20;
my $crit = 50;
my $percent_down = 10;
my $percent_up = 100 - $percent_down;
if ( $percent_down < $warn ) {
print "OK - $percent_up% UP";
exit 0;
}
elsif ( $percent_down < $crit ) {
print "WARNING - $percent_down% DOWN";
exit 1;
}
else {
print "CRITICAL - $percent_down% DOWN";
exit 2;
}
感谢您的评论,我明白了。
if ($percent_down lt $warn) {
print "OK - $percent_up% UP";
exit 0;
} elsif ($percent_down ge $warn && $percent_down lt $crit ) {
print "WARNING - $percent_down% DOWN";
exit 1;
} elsif ($percent_down ge $crit) {
print "CRITICAL - $percent_down% DOWN";
exit 2;
} else {
print "UNKNOWN - $err ";
exit 3;
}