在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%
我怎么能这样做?
编辑:
答案 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)
效率更高的版本只需调用mpstat
和awk
一次,并保持运行直到完成;无需显式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%。