尝试获取 Bash 中的总 CPU 使用率

尝试获取 Bash 中的总 CPU 使用率

我正在尝试用这个来获取 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

相关内容