Anda mungkin menggunakan fungsi berdasarkan top
kegunaan. Namun perhatikan, melakukan hal itu tidak terlalu dapat diandalkan karena penggunaan CPU dapat - dengan cepat - berubah sewaktu-waktu. Artinya hanya karena pemeriksaan berhasil, tidak dijamin bahwa penggunaan CPU akan tetap rendah selama kode berikut berjalan. Anda telah diperingatkan.
Fungsinya:
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
Perhatikan bahwa saya menggunakan bc -l
untuk perbandingan sejak top mencetak penggunaan CPU sebagai nilai 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
}
Perhatikan bahwa paket sysstat perlu diinstal.
Versi yang jauh lebih efisien hanya memanggil mpstat
dan awk
masing-masing satu kali, dan biarkan keduanya berjalan sampai selesai; tidak perlu secara eksplisit sleep
dan mulai ulang kedua proses setiap detik (yang, pada platform tersemat, dapat menambahkan hingga overhead terukur):
wait_until_cpu_low() {
awk -v target="$1" '
$13 ~ /^[0-9.]+$/ {
current = 100 - $13
if(current <= target) { exit(0); }
}' < <(LC_ALL=C mpstat 1)
}
Saya menggunakan $13
di sini karena di situlah idle %
adalah untuk versi mpstat saya; gantikan dengan tepat jika milik Anda berbeda.
Ini memiliki keuntungan ekstra dalam melakukan matematika floating point dengan benar, daripada harus membulatkan ke bilangan bulat untuk matematika asli shell.