实时 %iowait 监视器

实时 %iowait 监视器

我是脚本编写的新手,我知道下面的问题非常简单,但没有得到任何答案。

sar 命令给出以下输出,

root@virt01:~# sar 1 1

Linux 3.19.0-42-generic (virt01.ubuntu.com)     13/02/16        _x86_64_        (1 CPU)

12:19:55        CPU     %user     %nice   %system   %iowait    %steal     
%idle

12:19:56        all      0.00      0.00      0.00      0.00      0.00    
100.00
Average:        all      0.00      0.00      0.00      0.00      0.00    100.00
root@virt01:~#

只是想知道如何检查特定值,例如:%iowait,如果超过 50 则发送邮件警报。

如果您能帮忙我将非常感激。

谢谢。

答案1

从以下命令开始sar 1 1

# sar 1 1
Linux 4.14.14 (sys.local)   02/08/2018  _x86_64_    (4 CPU)
09:38:01 PM     CPU     %user     %nice   %system   %iowait    %steal     %idle
09:38:02 PM     all      5.74      0.00      1.50      0.00      0.00     92.77
Average:        all      5.74      0.00      1.50      0.00      0.00     92.77

我们需要 %iowait 列。每行中用于匹配正则表达式的公共字符串位于allCPU,因此:

# sar 1 1 | awk '/all|iowait/{print $7}'
%iowait
0.00
0.00

在本例中,我们iowait在正则表达式中添加了 以确认我们得到了正确的列$7。(man awk有关 awk 用法的更多详细信息,请参阅。)我们的下一步是保存这些值以供在脚本中使用:

# iowait=( $( sar 1 1 | awk '/all/{print $7}' ) )

var=()语法适用于数组。请参阅man bash了解详情。我们可以使用 ${iowait[1]} 引用这些值,因此现在我们准备对这两个值进行循环:

# iowait=( $( sar 1 1 | awk '/all/{print $7}' ) ) ; for I in ${iowait[*]} ; do \
   echo $I ; \
   done 
0.25
0.00

太好了,快完成了,现在我们可以用条件比较这些值了。这将需要一些额外的努力,因为 bash 更喜欢比较整数而不是浮点数。我们可以在比较之前将它们乘以 100,但使用 bash 快捷方式在比较之前删除小数更容易。要从变量中的 12.34 中得到 12 $I,我们将使用 ${I%%.*} 语法。这会从变量中删除匹配的后缀I,并且正则表达式.*会匹配任何内容,因此小数点后的所有内容。-lt在 bash 中将在条件中工作:if [ ]; then something; fi所有这些都在中详细概述man bash以供参考。

# iowait=( $( sar 1 1 | awk '/all/{print $7}' ) ) ; \
  for I in ${iowait[*]} ; do \
      if [ ${I%%.*} -lt 2 ] ; then \
         echo "$I < 2" ; \
      fi ; \
  done
0.00 < 2
0.00 < 2

在我们发送电子邮件之前最后做一点补充,让我们添加一个特定的时间戳,并看看在这个高 IO 期间运行了什么:

# iowait=( $( sar 1 1 | awk '/all/{print $7}' ) ) ; \
  for I in ${iowait[*]} ; do \
      if [ ${I%%.*} -lt 2 ] ; then \
         echo "$(date -Is): iowait = $I\n $(ps)" ; \
      fi ; \
  done 
2018-02-08T22:09:21-05:00: iowait = 0.25
   PID TTY          TIME CMD
 3431 pts/1    00:00:00 zsh
28148 pts/1    00:00:00 ps
2018-02-08T22:09:21-05:00: iowait = 0.00
   PID TTY          TIME CMD
 3431 pts/1    00:00:00 zsh
28150 pts/1    00:00:00 ps

当然,您可以根据需要使用更好的 ps 选项,例如ps eafps auxfw以了解更多详细信息。不,要真正完成任务(比较-gt 50)并通过将我们的输出传输到来发送电子邮件mailx

# iowait=( $( sar 1 1 | awk '/all/{print $7}' ) ) ; \
  for I in ${iowait[*]} ; do \
     if [ ${I%%.*} -gt 50 ] ; then echo "$(date -Is): iowait = $I\n $(ps)" |
        mailx -s "hi iowait" root ; \
     fi  ; \
  done

希望这既能回答您的问题,又能演示如何通过逐步分解问题、利用 unix 哲学、它的众多工具和手册页来构建您想要的东西。

相关内容