我编写了一个小的perl脚本来检测,如果分区因填充而出现问题。
我用bash shell调用我的脚本,如下所示:
chk_part.sh /PARTITION
效果很好,但是从8或9开始的计数器出现问题。 例如如果我的分区已经填满了8%,我会得到"关键"
我认为问题在于我使用字符(%
)和数字(8)混合进行比较(lt
,gt
,{{1} })。
我该如何解决?
eq
答案 0 :(得分:3)
您需要删除%
标志。一个好方法是使用正则表达式匹配和捕获组。同时,这有助于从df
找到格式错误的输出。
my $res = `df -h $LZE |awk 'FNR == 2 {print \$5}'`;
$res =~ m/(\d+)%/;
my $used_space = $1 or die "Something went wrong with df: $!";
given ($used_space) {
when ($used_space < 75) { ... }
}
第my $used_space = $1 or die "Something went wrong with df: $!";
行将匹配值($1
是第一个捕获组)分配给$user_space
。该操作返回相同的值。如果它不是真值(即undef
),则低约束or
将触发其右侧命令,程序将死亡。
有关详细信息,请参阅perlre。
答案 1 :(得分:2)
请注意given/when
是实验性的,您可能需要重新考虑使用它。不管怎样,我做了一些细微的修改,让你的代码做你想做的事。
它从正则表达式搜索/替换中删除%
$used_space
,从实际的comaprisons中删除%
符号,并将其添加到打印结果中。
my $used_space = `df -h $LZE |awk 'FNR == 2 {print \$5}'`;
$used_space =~ s/%//;
given ($used_space) {
chomp($used_space);
when ($used_space < 75) { print "OK - $used_space% of disk space used by $LZE\n"; exit(0); }
when ($used_space == 75) { print "WARNING - $used_space% of disk space used by $LZE\n"; exit(1); }
when ($used_space > 75) { print "CRITICAL - $used_space% of disk space used by $LZE\n"; exit(2); }
default { print "UNKNOWN - $used_space% of disk space used by $LZE\n"; exit(3); }
}
答案 2 :(得分:2)
或者没有不必要的3个外部二进制文件(bash
+ df
+ awk
)并解析其输出 - 使用Filesys::Df或{{3}例如:
#!/usr/bin/env perl
use 5.014;
use warnings;
use Filesys::Df;
my $limit = 75;
my @txt = qw(OK WARNING CRITICAL);
for my $fs (@ARGV) {
my $ref = df($fs);
unless($ref) { warn "Unknown filesystem $fs"; next }
my $lev = $ref->{per} < $limit ? 0 : $ref->{per} == $limit ? 1 : 2;
say "$txt[$lev] - $ref->{per}% of disk space used by $fs";
}
将其用作./mydf / /foobar /tmp
打印
OK - 66% of disk space used by /
Unknown filesystem /foobar at ./mydf line 10.
OK - 10% of disk space used by /tmp
答案 3 :(得分:1)
这里的问题是eq
之类的东西并没有做你所假设的。他们进行字符串值比较,所以进行字母数字比较。
请参阅:perlop
你正在逃避它,因为按字母顺序比较“两位数”&#39;百分比可以获得正确的结果。
但如果您按字母顺序排序:ab
出现在cdefg
之前。
所以基本上 - 不要使用那些运营商。从您的数字中创建一个数值(s/%//g
将执行此操作),然后与==
或<
或>
进行比较。
#!/usr/bin/env perl
use strict;
use warnings;
my @values = ( '7%', '8%', '9%', '10%', '11%', '75%', '80%', '100%' );
print join "\n", sort { $a cmp $b } @values;
这将为您提供以下订单:
10%
100%
11%
7%
75%
8%
80%
9%
我很确定这几乎就是你 想要的。 (因为&#39; 100%已满&#39;少于75%
!)
更改值以丢失百分比,然后使用数字运算符是可行的方法。
s/%//g for @values;
print join "\n", sort { $a <=> $b } @values;
答案 4 :(得分:0)
只想指出awk
在这里没用:
my $used_space = `df -h $LZE`;
$used_space =~ m/(\d+)%/;
$used_space = $1;
given ($used_space) {
when ($used_space < 75) { print "OK - $used_space of disk space used by $LZE\n"; exit(0); }
...