我是脚本编写的新手,我知道下面的问题非常简单,但没有得到任何答案。
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 列。每行中用于匹配正则表达式的公共字符串位于all
下CPU
,因此:
# 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 eaf
或ps 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 哲学、它的众多工具和手册页来构建您想要的东西。