我正在尝试用这个来获取 CPU 的总负载:
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
答案1
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
另外,要获取 CPU 的空闲百分比,mpstat | grep "all" | cut -c 92-
您可以执行以下操作:
mpstat | grep -Po 'all.* \K[^ ]+$'
答案2
我想出了这个解决方案并且它对我有用。
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/
答案3
使用命令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