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%
我该怎么做?
编辑:
- 目标 OS 是:Red Hat Enterprise Linux 服务器版本 6.5
- 我正在考虑平均 CPU 使用率(跨所有内核)
您可以使用基于 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 包。
一个更高效的版本只调用 mpstat
和 awk
一次,并保持它们 运行 直到完成;无需显式 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%。
在 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%
我该怎么做?
编辑:
- 目标 OS 是:Red Hat Enterprise Linux 服务器版本 6.5
- 我正在考虑平均 CPU 使用率(跨所有内核)
您可以使用基于 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 包。
一个更高效的版本只调用 mpstat
和 awk
一次,并保持它们 运行 直到完成;无需显式 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%。