如何自动监视CPU使用情况并在达到阈值时返回结果

时间:2017-12-14 04:25:58

标签: linux bash shell ubuntu

我是shell脚本的新手,我想编写一个脚本来监控CPU使用率,如果CPU使用率达到阈值,它应该按top命令打印CPU使用率,这是我的脚本,这给了我错误的错误号码并且也不在日志文件中存储任何值

while sleep 1;do if [ "$(top -n1 | grep -i ^cpu | awk '{print $2}')">>sy.log - ge "$Threshold" ]; then echo "$(top -n1)">>sys.log;fi;done

2 个答案:

答案 0 :(得分:0)

您的脚本需要缩进并存储到文件中,特别是如果您不熟悉shell!

#!/bin/sh

while sleep 1
do 
    if [ "$(top -n1 | grep -i ^cpu | awk '{print $2}')">>sy.log - ge "$Threshold" ]
then
    echo "$(top -n1)"  >>  sys.log
fi
done

你的情况看起来有点奇怪。它可能有效,但看起来非常复杂。将中间结果存储在变量中,并对其进行评估。 然后,您将立即在“-ge”上看到语法错误。

出于安全原因,您必须将日志文件存储在绝对路径中。使用变量来简化阅读。

#!/bin/sh

LOGFILE=/absolute_path/sy.log
WHOLEFILE=/absolute_path/sys.log
Thresold=80

while sleep 1
do 
   TOP="$(top -n1)"
   CPU="$(echo $TOP | grep -i ^cpu | awk '{print $2}')"
   echo $CPU >> $LOGFILE
   if [ "$CPU" -ge "$Threshold" ] ; then
       echo "$TOP"  >>  $WHOLEFILE
   fi
done

答案 1 :(得分:0)

你有几个错误。

  • 如果使用重定向将输出写入sy.log,则shell不再提供该输出。您可以使用tee
  • 解决此问题
  • -ge之前的短划线后面不能有空格。

另外,一些风格的评论:

  • grep x | awk '{y}'useless use of grep;这可以有效地,更经济地(以及更优雅地)被重写为awk '/x/{y}'
  • echo "$(command)"useless use of echo - 不是交易破坏者,但您只需要command;没有必要捕获它打印到标准输出的内容,因此您可以将该文本打印到标准输出。
  • 如果您要捕获top -n 1的输出,则无需真正运行两次。

补充说明:

  • 如果您知道要提取的字段的大小写,可能您不需要不区分大小写搜索。 (我找不到top的版本,它在第二个字段中打印带有加载的CPU前缀 - 表达式是否正确?)
  • shell仅支持整数运算。这是一个错误吗?也许您想使用Awk(具有浮点支持)来执行比较?这也允许适度棘手的重构。如果比较失败,我们会使Awk输出退出代码为1,并将其用作if的条件。
#!/bin/sh

while sleep 1
do
    if top=$(top -n 1 |
        awk -v thres="$Threshold" '1; # print every line
            tolower($1) ~ /^cpu/ { print $2 >>"sy.log";
                exitcode = ($2 >= thres ? 0 : 1) }
            END { exit exitcode }')
    then
        echo "$top" >>sys.log
    fi
done

你真的想要有两个几乎同名的日志文件,或者这是一个错字?在日志中包含时间戳可能对故障排除和实际使用日志文件都很有用。