Sie könnten eine Funktion verwenden, die auf top
basiert Dienstprogramm. Beachten Sie jedoch, dass dies nicht sehr zuverlässig ist, da sich die CPU-Auslastung jederzeit schnell ändern kann. Das heißt, nur weil die Prüfung erfolgreich war, ist nicht garantiert, dass die CPU-Auslastung niedrig bleibt, solange der folgende Code ausgeführt wird. Sie wurden gewarnt.
Die Funktion:
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
Beachten Sie, dass ich bc -l
verwende für den Vergleich, da top die CPU-Auslastung als Float-Wert ausgibt.
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
}
Beachten Sie, dass das sysstat-Paket installiert sein muss.
Eine viel effizientere Version ruft einfach mpstat
auf und awk
jeweils einmal und lässt sie beide laufen, bis sie fertig sind; keine Notwendigkeit, explizit sleep
und starten Sie beide Prozesse jede Sekunde neu (was sich auf einer eingebetteten Plattform zu einem messbaren Overhead summieren könnte):
wait_until_cpu_low() {
awk -v target="$1" '
$13 ~ /^[0-9.]+$/ {
current = 100 - $13
if(current <= target) { exit(0); }
}' < <(LC_ALL=C mpstat 1)
}
Ich verwende $13
hier, weil dort idle %
ist ist für meine Version von mpstat; entsprechend ersetzen, wenn Ihre anders ist.
Dies hat den zusätzlichen Vorteil, dass Gleitkomma-Berechnungen korrekt ausgeführt werden, anstatt für Shell-native Berechnungen auf Ganzzahlen runden zu müssen.