55 lines
1.4 KiB
Bash
Executable File
55 lines
1.4 KiB
Bash
Executable File
#!/bin/bash
|
|
# Temp file to store previous readings
|
|
tmpfile="/tmp/cpu_prev_all"
|
|
|
|
# Get all per-core lines
|
|
mapfile -t cpu_lines < <(grep '^cpu[0-9]' /proc/stat)
|
|
|
|
# On first run, save and exit
|
|
if [[ ! -f $tmpfile ]]; then
|
|
printf "%s\n" "${cpu_lines[@]}" > "$tmpfile"
|
|
echo "..." # No previous data
|
|
exit 0
|
|
fi
|
|
|
|
# Load previous readings
|
|
mapfile -t prev_lines < "$tmpfile"
|
|
|
|
# Sanity check
|
|
if (( ${#cpu_lines[@]} != ${#prev_lines[@]} )); then
|
|
echo "..." # Core count mismatch (e.g., suspend/resume)
|
|
printf "%s\n" "${cpu_lines[@]}" > "$tmpfile"
|
|
exit 0
|
|
fi
|
|
|
|
total_usage=0
|
|
|
|
for i in "${!cpu_lines[@]}"; do
|
|
# Current
|
|
read -r cpu user nice system idle iowait irq softirq steal _ _ <<< "${cpu_lines[$i]}"
|
|
total_now=$((user + nice + system + idle + iowait + irq + softirq + steal))
|
|
idle_now=$((idle + iowait))
|
|
|
|
# Previous
|
|
read -r _ pu pn ps pi piw pir psf pst _ _ <<< "${prev_lines[$i]}"
|
|
total_prev=$((pu + pn + ps + pi + piw + pir + psf + pst))
|
|
idle_prev=$((pi + piw))
|
|
|
|
# Deltas
|
|
diff_total=$((total_now - total_prev))
|
|
diff_idle=$((idle_now - idle_prev))
|
|
|
|
if ((diff_total > 0)); then
|
|
usage=$((100 * (diff_total - diff_idle) / diff_total))
|
|
total_usage=$((total_usage + usage))
|
|
fi
|
|
done
|
|
|
|
# Output total usage (per-core sum)
|
|
#echo '{"usage": ${total_usage}%}'}
|
|
printf "{ \"text\": %6.0f, \"tooltip\": \"%s\" }" "$total_usage" "test"
|
|
|
|
|
|
# Save current readings
|
|
printf "%s\n" "${cpu_lines[@]}" > "$tmpfile"
|