В моей конфигурации tmux мне нравится отображать некоторые основные статистические данные (загрузка ЦП, использование памяти и т. Д.) В строке состояния внизу. Чтобы вычислить загрузку процессора, я ранее делал следующее:
cpuusage=$(ps -Ao pcpu | awk '{sum = sum + $1}END{printf "%4.1f", sum}')
Это работало на моем старом ноутбуке с Ubuntu, где значение $cpuusage
варьировалось от 0.0
до 100.0
. Но, переходя на свой Mac, я начал получать значения загрузки процессора, такие как 113.7
или 239.8
- намного выше максимального значения 100.0
, которое я ожидаю. Ответ был довольно быстро очевиден: он дает возможность использовать одно ядро, а эта машина имеет 12 ядер.
Чтобы исправить это, я хотел бы разделить на количество ядер. Чтобы получить количество ядер, я использовал sysctl -n hw.ncpu
. На моем Mac это возвращает 12
. Затем я попытался разделить так:
cpupercent=$(($cpuusage/$(sysctl -n hw.ncpu)))
До тех пор, пока cpuusage
было целым числом, кратным 12, это работало (например, когда $cpuusage
было точно 60
, это возвращало 5
)однако всякий раз, когда использование не делилось на 12, это просто возвращало пустую строку.
Я подозреваю, что проблема в том, что $cpuusage
- это строка, а не целое число или число с плавающей запятой (и после некоторых фундаментальных исследований я 'мы определили, что Bash на самом деле не поддерживает операции с плавающей точкой), но я не уверен, как мне решить эту проблему.
Должен ли я ускорить второй awk
процесс и передать как использование процессора, так иколичество процессоров, например?
cpupercent=$(awk '{printf "%4.1f", $1 / $2}' <<< $cpuusage $(sysctl -n hw.ncpu))
или есть способ передать количество процессоров непосредственно в первый awk
процесс?
cpupercent=$(ps - Ao pcpu | <insert num CPU> | awk '{sum = sum + $1}END{printf "%4.1f", sum / $2}')
или есть какой-то другойинструмент, который я должен использовать для этой работы, например bc
?