Bash:等到CPU使用率低于阈值

时间:2015-08-31 12:53:47

标签: linux bash cpu-usage

在bash脚本中,我需要等到CPU使用率低于阈值。

换句话说,我需要一个命令wait_until_cpu_low,我会这样使用:

# Trigger some background CPU-heavy command
wait_until_cpu_low 40
# Some other commands executed when CPU usage is below 40%

我怎么能这样做?

编辑:

  • 目标操作系统是:Red Hat Enterprise Linux Server 6.5版
  • 我考虑的是平均CPU使用率(跨所有核心)

4 个答案:

答案 0 :(得分:3)

您可以使用基于top实用程序的函数。但请注意,这样做并不是非常可靠,因为CPU利用率可能会随时迅速变化。这意味着只是因为检查成功,不能保证只要以下代码运行,CPU利用率就会保持低水平。你被警告了。

功能:

function wait_for_cpu_usage {
    threshold=$1
    while true ; do
        # Get the current CPU usage
        usage=$(top -n1 | awk 'NR==3{print $2}' | tr ',' '.')

        # Compared the current usage against the threshold
        result=$(bc -l <<< "$usage <= $threshold")
        [ $result == "1" ] && break

        # Feel free to sleep less than a second. (with GNU sleep)
        sleep 1
    done
    return 0
}

# Example call
wait_for_cpu_usage 25

请注意,我使用bc -l进行比较,因为top会将CPU利用率打印为浮点值。

答案 1 :(得分:3)

wait_for_cpu_usage()
{
    current=$(mpstat 1 1 | awk '$12 ~ /[0-9.]+/ { print int(100 - $12 + 0.5) }')
    while [[ "$current" -ge "$1" ]]; do
        current=$(mpstat 1 1 | awk '$12 ~ /[0-9.]+/ { print int(100 - $12 + 0.5) }')
        sleep 1
    done
}

请注意,它需要安装sysstat软件包。

答案 2 :(得分:3)

效率更高的版本只需调用mpstatawk一次,并保持运行直到完成;无需显式sleep并每秒重启两个进程(在嵌入式平台上,这可能会增加可衡量的开销):

wait_until_cpu_low() {
  awk -v target="$1" '
    $13 ~ /^[0-9.]+$/ {
      current = 100 - $13
      if(current <= target) { exit(0); }
    }' < <(mpstat 1)
}

我在这里使用$13,因为idle %代表我的mpstat版本;如果你的不同,可以适当地替换。

这具有正确执行浮点数学的额外优势,而不是需要舍入到整数以进行shell本机数学运算。

答案 3 :(得分:0)

正如“Llama 先生”在上面的评论中所指出的,我已经使用正常运行时间来编写我的简单函数:

function wait_cpu_low() {
  threshold=$1
  while true; do
    current=$(uptime | awk '{ gsub(/,/, ""); print $10 * 100; }')
    if [ $current -lt $threshold ]; then
      break;
    else
      sleep 5
    fi
  done
}

在 awk 表达式中:

  • $10 是获取最后一分钟的平均 CPU 使用率
  • $11 是获取过去 5 分钟内的平均 CPU 使用率
  • $12 是获取过去 15 分钟内的平均 CPU 使用率

这是一个用法示例:

wait_cpu_low 20

等待一分钟,平均 CPU 使用率低于一个 CPU 核心的 20%。