Files
dotfiles/.config/waybar/scripts/cpu_linux.sh
T
2025-07-25 10:50:09 +02:00

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"