Potresti usare una funzione basata su top
utilità. Ma nota che ciò non è molto affidabile perché l'utilizzo della CPU potrebbe - rapidamente - cambiare in qualsiasi momento. Ciò significa che solo perché il controllo ha avuto esito positivo, non è garantito che l'utilizzo della CPU rimanga basso finché viene eseguito il codice seguente. Sei stato avvisato.
La funzione:
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
Nota che sto usando bc -l
per il confronto since top stampa l'utilizzo della CPU come valore float.
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
}
Si noti che richiede l'installazione del pacchetto sysstat.
Una versione molto più efficiente chiama semplicemente mpstat
e awk
una volta ciascuno, e li fa funzionare entrambi fino al termine; non c'è bisogno di sleep
esplicitamente e riavviare entrambi i processi ogni secondo (che, su una piattaforma integrata, potrebbe sommarsi a un sovraccarico misurabile):
wait_until_cpu_low() {
awk -v target="$1" '
$13 ~ /^[0-9.]+$/ {
current = 100 - $13
if(current <= target) { exit(0); }
}' < <(LC_ALL=C mpstat 1)
}
Sto usando $13
qui perché è lì che idle %
è per la mia versione di mpstat; sostituisci in modo appropriato se il tuo è diverso.
Questo ha l'ulteriore vantaggio di eseguire correttamente la matematica in virgola mobile, piuttosto che dover arrotondare a numeri interi per la matematica nativa della shell.