0

我想监控服务器的磁盘 IO 并想设置不同的阈值

  • 警告if %busy above 60%
  • 错误if %busy above 80%

从 sar 输出需要找到超过 80% 繁忙的错误磁盘,并且在第二行需要磁盘超过 60 但低于 80% 的繁忙,如果磁盘没有越过阈值,那么它应该为各个类别打印“ok”

我已经创建了一个可以执行此操作的脚本,但是有没有更好的方法来运行sar一次并将相同的输出用于错误和警告阈值?我的系统是 AIX 6.1。

sar -d 2 2 |sed -n '/Average/,$p'|
     sed -e 's/Average//g'|
     awk 'NR> 1 {
         if ($2 >80) {
             print $1, $2; f=1
         }  
     }
     END { if (!f) print "ok" }'

sar -d 2 2 |
    sed -n '/Average/,$p'|
    sed -e 's/Average//g'|
    awk 'NR> 1{ if ($2 >60 && $2 <81)  { print $1, $2; f=1; }  }
    END { if (!f) print "ok" }'

请在下面找到我更新的脚本

bash-3.00$ cat diskio.sh
#!/bin/bash
a=`sar -d 2 2 |sed -n '/Average/,$ {s/Average//g;p;}'`
e=`$a|awk 'NR> 1{ if ($2 >40)  { print $1, $2; f=1; }  }
    END { if (!f) print "ok" }'`
w=`$a|awk 'NR> 1{ if ($2 <40 && $2 >20)  { print $1, $2; f=1; }  }
    END { if (!f) print "ok" }'`
echo $e
echo $w

bash-3.00$ sh -v diskio.sh
#!/bin/bash
a=`sar -d 2 2 |sed -n '/Average/,$ {s/Average//g;p;}'`
e=`$a|awk 'NR> 1{ if ($2 >40)  { print $1, $2; f=1; }  }
    END { if (!f) print "ok" }'`
diskio.sh[3]: hdisk18:  not found.
w=`$a|awk 'NR> 1{ if ($2 <40 && $2 >20)  { print $1, $2; f=1; }  }
    END { if (!f) print "ok" }'`

diskio.sh[4]: hdisk18:  not found.
echo $e
ok
echo $w
ok
bash-3.00$ sar -d 2 2 |
    sed -n '/Average/,$ {s/Average//g;p;}'|
        awk 'NR> 1{ if ($2 >40)  { print $1, $2; f=1; }  }
        END { if (!f) print "ok" }'

hdisk79 135
hdisk101 85
bash-3.00$
4

2 回答 2

2
sed -n '/Average/,$p'|sed -e 's/Average//g'

可以替换为

sed -n '/Average/,$ {s/Average//g;p;}'

但是 sed 不会轻易地对价值进行任何评估(比较),所以 awk for all 是一个更好的解决方案

于 2013-11-12T07:25:06.693 回答
2

这可以缩短一些。

sar -d 2 2 | awk '/Average/ {t=1;next} t && NR>1 && $2>80 {print $1,$2;f=1} END { if (!f) print "ok" }'

这应该做你想做的

sar -d 2 2 | awk '/Average/ {t=1;next} t && NR>1 {if ($2>80) h=1;if ($2>60) l=1} END {if (h) {print "80+";exit};if (l) print "60+"}'

60+如果它在上面6080+上面,它将打印80


或将其存储到变量中

status=$(sar -d 2 2 | awk '/Average/ {t=1;next} t && NR>1 {if ($2>80) h=1;if ($2>60) l=1} END {if (h) {print "H";exit};if (l) print "L"}')

在这里它设置statusLfor60+Hfor80+


这也应该打印状态:

sar -d 2 2 | awk '/Average/ {t=1;next} t && NR>1 {if ($2>80) h=1;if ($2>60) {print $1,$2;l=1}} END {if (!l) print "ok"}'
于 2013-11-12T06:42:02.863 回答