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

Bash: wait until CPU usage gets below a threshold

在 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%

我该怎么做?

编辑:

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

函数:

function wait_for_cpu_usage {
    threshold=
    while true ; do
        # Get the current CPU usage
        usage=$(top -n1 | awk 'NR==3{print }' | 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 进行比较,因为顶部将 CPU 利用率打印为浮点值。

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

注意它需要安装 sysstat 包。

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

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

我在这里使用 </code> 是因为 <code>idle % 用于我的 mpstat 版本;如果您的不同,请适当替换。

这具有正确进行浮点数学运算的额外优势,而不是需要为 shell-native 数学运算舍入为整数。

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

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

在 awk 表达式中:

  • </code> 是获取最后一分钟的平均 CPU 使用率</li> <li><code> 是获取最近 5 分钟的平均 CPU 使用率
  • </code> 是获取过去 15 分钟的平均 CPU 使用率</li> </ul> <p>这是一个用法示例:</p> <pre><code>wait_cpu_low 20

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