私はこれで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
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[^ ]+$'
コマンド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
私はこの解決策を思いつきました。
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/