当 CPU 低于 80% 时运行命令

当 CPU 低于 80% 时运行命令

我试图在 CPU 使用率低于 80% 时每 10 分钟运行一次命令。我不习惯 bash 脚本。我找到了一种方法来获取 CPU 的总使用量``top -b -n1 | grep“CPU”| awk '{print $2 + $4}'` 然后我想与最大值 80% 进行比较。但我不知道为什么我不能比较两者。这里是脚本:

#!/bin/bash

MAX=80
CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`

while true
  do
    if $CPU < $MAX
      then
        echo $CPU  # This is an example
        CPU=`top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}'`
        sleep 10m
      fi
    done

脚本失败,因为将数字解释为命令... ( cannot open 80: No such file) 为什么我无法编译$MAXand $CPU?你会如何解决这个问题?

提前致谢。

答案1

<是用来 重定向。如果需要比较整数:

if [ "$MAX" -gt "$CPU" ]

$CPU也可以是浮点数,bash 不能直接对浮点数进行操作,所以你必须使用bc

if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]

您还应该使用$(..)表单而不是遗留反引号并且您只能CPU 在 while 循环内分配一次:

#!/bin/bash

MAX=80

while true
do
    CPU="$(top -b -n1 | grep "Cpu(s)" | awk '{print $2 + $4}')"

    if [ "$(bc -l <<< "${CPU} > ${MAX}")" -eq 1 ]
    then
        echo "$CPU"  # This is an example
        sleep 10m
    fi
done

答案2

top(1)不是解决这个问题的最好方法。这是一个相当重量级的测量工具,扫描的内容远远超出您的需要。此外,它关注的是瞬时值,这在这里是不正确的。

相反,你应该使用系统平均负载因为它们是在内核中长时间连续计算的。这意味着它们不会产生额外费用,因此不会影响您的测量,并且它们不会受到瞬时变化的影响......例如呼叫top(1)

这是根据平均负载重写的脚本:

#!/bin/bash
HIGH_LOAD=6      # 80% of an 8-core system; see link above

while true
  do
    CURR_LOAD=$(cut -f2 -d' ' < /proc/loadavg)
    if [ $CURR_LOAD -lt $HIGH_LOAD ]
      then
        run-background-command
      fi
    sleep 10m
  done

请注意,sleep呼叫已移至if条件之外:无论如何您都想延迟。也许您想添加一个else替代项,以便低负载情况和高负载情况下的延迟不同。

与您的版本不同的是,我们不会在循环内部和外部重复 CPU 使用情况检查。

相关内容