Puede usar una función basada en el top
utilidad. Pero tenga en cuenta que hacerlo no es muy confiable porque la utilización de la CPU puede cambiar rápidamente en cualquier momento. Lo que significa que solo porque la verificación tuvo éxito, no se garantiza que la utilización de la CPU se mantenga baja mientras se ejecute el siguiente código. Has sido advertido.
La función:
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
Tenga en cuenta que estoy usando bc -l
para la comparación, ya que top imprime la utilización de la CPU como un valor flotante.
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
}
Tenga en cuenta que requiere el paquete sysstat instalado.
Una versión mucho más eficiente simplemente llama a mpstat
y awk
una vez cada uno, y los mantiene a ambos ejecutándose hasta que terminen; no es necesario explícitamente sleep
y reinicie ambos procesos cada segundo (lo que, en una plataforma integrada, podría sumar una sobrecarga medible):
wait_until_cpu_low() {
awk -v target="$1" '
$13 ~ /^[0-9.]+$/ {
current = 100 - $13
if(current <= target) { exit(0); }
}' < <(LC_ALL=C mpstat 1)
}
estoy usando $13
aquí porque ahí es donde idle %
es para mi versión de mpstat; sustitúyalo apropiadamente si el suyo es diferente.
Esto tiene la ventaja adicional de hacer correctamente las matemáticas de punto flotante, en lugar de tener que redondear a números enteros para las matemáticas nativas de shell.