commits
tags
#!/bin/sh
# cpu module -- everything the module needs, dispatched by subcommand:
# cpu.sh -> bar text, "NN%"
# cpu.sh usage "PREFIX" -> same usage %, with PREFIX prepended (popup row)
# cpu.sh mem -> "Mem: used/total" (popup row)
# cpu.sh cores -> "Cores: 0:NN% 1:NN% ..." (popup row)
# cpu.sh menu -> popup definition, read once at startup (see
# README, "Module-declared menus")
mode="${1:-usage}"
case "$mode" in
menu)
self="$0"
echo 'popup : hover : buttons'
echo "popup_info : \"$self usage 'CPU: '\""
echo "popup_info : \"$self mem\""
echo "popup_info : \"$self cores\""
;;
usage)
prefix="${2:-}"
# two /proc/stat samples 0.2s apart -- top(1)'s own output is
# localised and unparseable
{ grep -m1 '^cpu ' /proc/stat; sleep 0.2; grep -m1 '^cpu ' /proc/stat; } |
LC_ALL=C awk -v prefix="$prefix" '
NR==1 { for (i=2;i<=8;i++) t1+=$i; d1=$5+$6 }
NR==2 {
for (i=2;i<=8;i++) t2+=$i; d2=$5+$6; d=t2-t1
printf "%s%d%%\n", prefix, (d>0 ? (1-(d2-d1)/d)*100 : 0)
}'
;;
mem)
LC_ALL=C free -h | awk '/^Mem:/{print "Mem: " $3"/"$2}'
;;
cores)
# two /proc/stat samples paired up by position via an awk array --
# no process substitution, since /bin/sh may be dash
a=$(grep '^cpu[0-9]' /proc/stat)
n=$(printf '%s\n' "$a" | wc -l)
sleep 0.2
b=$(grep '^cpu[0-9]' /proc/stat)
printf '%s\n%s\n' "$a" "$b" | LC_ALL=C awk -v n="$n" '
NR<=n {
t1[NR]=0; for (i=2;i<=8;i++) t1[NR]+=$i
d1[NR]=$5+$6; name[NR]=$1
}
NR>n {
j=NR-n; t2=0; for (i=2;i<=8;i++) t2+=$i
d2=$5+$6; d=t2-t1[j]
pct=(d>0)?(1-(d2-d1[j])/d)*100:0
gsub(/cpu/,"",name[j])
printf "%s:%d%% ", name[j], pct
}
BEGIN { printf "Cores: " }
END { print "" }'
;;
esac