web-dev-qa-db-ja.com

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

2
Ben

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-の代わりにCPUのID%を取得するには、次のようにします。

mpstat | grep -Po 'all.* \K[^ ]+$'
3
heemayl

コマンドuptimeを使用します。過去1、5、および15分間のシステム負荷平均を示します( man page )。

# 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
0
xinthose

私はこの解決策を思いつきました。

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/

0
Mo Beigi