Vous pouvez utiliser une fonction basée sur le top
utilitaire. Mais notez que cela n'est pas très fiable car l'utilisation du processeur peut - rapidement - changer à tout moment. Cela signifie que simplement parce que la vérification a réussi, il n'est pas garanti que l'utilisation du processeur restera faible tant que le code suivant s'exécute. Vous êtes prévenu.
La fonction :
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
Notez que j'utilise bc -l
pour la comparaison puisque top imprime l'utilisation du processeur sous forme de valeur flottante.
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
}
Notez qu'il nécessite l'installation du package sysstat.
Une version beaucoup plus efficace appelle simplement mpstat
et awk
une fois chacun, et les maintient tous les deux en cours d'exécution jusqu'à ce qu'ils soient terminés ; pas besoin de sleep
explicitement et redémarrez les deux processus toutes les secondes (ce qui, sur une plate-forme embarquée, pourrait représenter une surcharge mesurable) :
wait_until_cpu_low() {
awk -v target="$1" '
$13 ~ /^[0-9.]+$/ {
current = 100 - $13
if(current <= target) { exit(0); }
}' < <(LC_ALL=C mpstat 1)
}
J'utilise $13
ici parce que c'est là idle %
est pour ma version de mpstat; remplacez-le de manière appropriée si le vôtre diffère.
Cela a l'avantage supplémentaire de faire correctement les calculs en virgule flottante, plutôt que d'avoir à arrondir à des nombres entiers pour les calculs natifs du shell.