1 2 | / 80% /root/diskresp /data 100G /root/diskresp |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #!/usr/bin/perl use strict; my $DISKTABFILE = "/root/disktab"; if ($ARGV[0] ne "") { $DISKTABFILE = $ARGV[0]; } # 因为 Linux 和 AIX 的 df 命令格式略有不同,所以首先判断一下 my $OS = `uname`; chomp $OS; my $DF; if ($OS eq "Linux") { $DF = "df -h"; } elsif ($OS eq "AIX") { # AIX 中的 df 命令,在这里使用了 -m 选项,则其输出都将以 MB 为单位(但是 MB 字样不会出现在结果输出中) $DF = "df -I -m"; } else { print "This OS is not supported.\n"; exit 1; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | # 分析 /root/disktab 文件 my %table = getTable($DISKTABFILE); sub getTable { # 通过参数取得 table 文件的位置 my ($tabfile) = @_; my %rs; # 打开文件 unless(open(TABF, $tabfile)) { print "Can't open file '$tabfile'.\n"; exit 1; } # 分析 disktab 文件每行的内容,将其存放在一个 hash table 中 foreach my $line (<TABF>) { # 使用正则表达式,分析出 table 文件中每一行的挂载点、阈值大小和采取的行动 if(!($line =~ /^#/) && $line =~ /(\S+)\s+(\S+)\s+(.*)\s*$/) { my $mp = $1; my $size = $2; my $action = $3; $rs{$mp} = [$size, $action]; } } close TABF; return %rs; } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 | # 将分析出的 hash table 以引用的形式传递给 checkDisk 函数,checkDisk 函数完成检查分区空间,并执行相应动作的任务。 checkDisk(\%table); sub checkDisk { my ($tab) = @_; my @df_rs = `$DF`; # 执行 df 命令 chomp @df_rs; my ($mp, $used_size, $used_perc); my ($minsize, $minperc); my $comp_with_perc; # 此变量用于表明是使用百分比进行比较还是使用绝对空间大小值 my %rs; my $env_str; # 分析 df 命令的每一行输出 foreach my $line (@df_rs) { $comp_with_perc = 0; # 使用正则表达式,分析出 df 输出的每一行的挂载点、空间使用大小和空间使用百分比 if ($line =~ /^\S+\s+\S+\s+(\S+)\s+\S+\s+(\d+)%\s+(\S+)\s*$/) { $mp = $3; $used_size = $1; $used_perc = $2; } else { next; } # 如果某个分区的 Mount Point 在 table 中有一项和它对应,则继续进行,否则分析下一行 if (!defined($$tab{$mp})) { next; } # 将得到的信息,存储起来,作为环境变量传递给将要运行的响应脚本 $env_str = "DISK_MOUNTP=$mp"; $env_str .= " DISK_MIN=$$tab{$mp}[0]"; $env_str .= $used_size =~ /^\d+\.?\d*$/ ? " DISK_USED=${used_size}M" : " DISK_USED=$used_size"; $env_str .= " DISK_USED_PERC=$used_perc%"; # 分析 hash table 中的阈值,如果阈值使用的是大小值,则现将其统一单位为 MB if ($$tab{$mp}[0] =~ /^(\d+\.?\d*)G$/) { $minsize = $1 * 1024; }elsif ($$tab{$mp}[0] =~ /^(\d+\.?\d*)M$/) { $minsize = $1; }elsif ($$tab{$mp}[0] =~ /^(\d+\.?\d*)K$/) { $minsize = $1 / 1024; }elsif ($$tab{$mp}[0] =~ /^(\d+\.?\d*)%$/) { $minperc = $1; # 如果 hash table 中阈值存放的是一个百分比,则表明要进行占用百分比的比较 $comp_with_perc = 1; }else { print "Format error: $$tab{$mp}[0]\n"; next; } # 如果使用空间占用 size 进行比较,则也将 df 命令中得到的空间大小统一单位到 MB if (!$comp_with_perc) { if ($used_size =~ /^(\d+\.?\d*)G$/) { $used_size = $1 * 1024; }elsif ($used_size =~ /^(\d+\.?\d*)M$/ || $used_size =~ /^(\d+\.?\d*)$/) { $used_size = $1; }elsif ($used_size =~ /^(\d+\.?\d*)K$/) { $used_size = $1 / 1024; } } # 比较实际空间占用和 table 中记录的阈值 if ((!$comp_with_perc && $minsize < $used_size) || ($comp_with_perc && $minperc < $used_perc)) { print "WARNING DISK SIZE for $mp\n"; # 调用 table 中记录的响应脚本,$env_str 中存放的 DISK_MOUNTP,DISK_MIN,DISK_USED, # DISK_USED_PERC,作为环境变量传递给脚本 my $cmd = "$env_str $$tab{$mp}[1] 2>&1"; print "Running command: $cmd\n"; my $output = `$cmd`; chomp $output; print "Output:\n$output\nExit code = $?\n"; } } } |
1 2 3 | #!/bin/bash echo "The $DISK_MOUNTP is now used $DISK_USED ($DISK_USED_PERC), over $DISK_MIN." | mail -s "WARNING DISK SIZE for $DISK_MOUNTP" root |
欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) | Powered by Discuz! 7.0.0 |