Я пытаюсь получить общую нагрузку ЦП с этим:
IDLE=$(mpstat | grep "all" | cut -c 92-)
CPULD=$(expr 100 - $IDLE)
echo $CPULD
но это всегда возвращается:
expr: non-integer argument on the second line.
Я озирался, и все говорят, что целые числа будут автоматически распознаны в строках, но это, кажется, не работает.
Править: Для тех из Вас, кто хочет видеть мой полный и теперь рабочий сценарий, это здесь: http://pastebin.com/cFQzz4Up
bash
(и expr
) не может сделать арифметики с плавающей точкой, необходимо взять справку bc
.
Например:
$ IDLE=$(mpstat | grep "all" | cut -c 92-)
Позволяет говорят $IDLE
77.25.
Теперь Вам нужно bc
:
$ IDLE=77.25
$ CPULD="$(bc <<<"100 - $IDLE")"
$ echo "$CPULD"
22.75
bc
воздействует на файлы, таким образом, мы можем передать строку управления через STDIN, хотя я предпочитаю здесь строки:
$ echo "100 - 45.34" | bc
54.66
$ bc <<<"100 - 45.34"
54.66
На другой ноте, для получения НЕАКТИВНОГО % ЦП, вместо mpstat | grep "all" | cut -c 92-
можно сделать:
mpstat | grep -Po 'all.* \K[^ ]+$'
Я предложил это решение, и оно работает на меня.
echo print `top -n 1 | tr -s " " | cut -d$" " -f10 | tail -n +8 | head -n -1 | paste -sd+ | bc`/ `nproc` | python
Источник (опишите): https://mohammadg.com/programming/how-to-get-overall-cpu-utilization-from-the-bash-command-line /
Используйте команду uptime
. Это дает средние числа системной нагрузки для прошлого 1, 5, и 15 минут ( страница справочника ).
# 1. get total average CPU usage for the past minute
avg_cpu_use=$(uptime)
# 2. split response
IFS=',' read -ra avg_cpu_use_arr <<< "$avg_cpu_use"
# 3. find cpu usage
avg_cpu_use=""
for i in "${avg_cpu_use_arr[@]}"; do :
if [[ $i == *"load average"* ]]; then
avg_cpu_use=$i
break
fi
done
# 4. create response
avg_cpu_use=$(echo ${avg_cpu_use:16}) # Remove " load average: "
if [[ -z "${avg_cpu_use// }" ]]; then
avg_cpu_use="CPU: N/A perc used"
exit -1
else
avg_cpu_use="CPU: ${avg_cpu_use} perc used"
fi