Můžete použít funkci založenou na top
utility. Všimněte si však, že to není příliš spolehlivé, protože využití CPU se může - rychle - kdykoli změnit. To znamená, že jen proto, že kontrola proběhla úspěšně, není zaručeno, že využití CPU zůstane nízké, dokud bude spuštěn následující kód. Byli jste varováni.
Funkce:
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
Všimněte si, že používám bc -l
pro srovnání, protože top vypisuje využití CPU jako plovoucí hodnotu.
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
}
Všimněte si, že vyžaduje nainstalovaný balíček sysstat.
Mnohem efektivnější verze pouze volá mpstat
a awk
každý jednou a nechá je oba běžet, dokud nebudou hotové; není třeba explicitně sleep
a restartujte oba procesy každou sekundu (což by na vestavěné platformě mohlo přinést měřitelnou režii):
wait_until_cpu_low() {
awk -v target="$1" '
$13 ~ /^[0-9.]+$/ {
current = 100 - $13
if(current <= target) { exit(0); }
}' < <(LC_ALL=C mpstat 1)
}
Používám $13
tady, protože tam je idle %
je pro mou verzi mpstat; vhodně nahraďte, pokud se vaše liší.
To má další výhodu v tom, že správně počítáte s plovoucí desetinnou čárkou, místo abyste museli zaokrouhlovat na celá čísla pro shell-nativní matematiku.