#! /bin/sh proc_stat_parse() { proc_stat="$1" n='[0-9]\+' echo "$proc_stat" \ | grep "^cpu$n $n $n $n $n $n $n $n $n $n $n$" \ | awk ' { cpu = $1; user = $2; sys = $4; idle = $5; total = user + sys + idle; busy = user + sys; if (NR > 1) {printf " "}; out = sprintf("%s %d %d", cpu, total, busy); #print out >> "cpu_usage_debug.txt"; printf "%s", out; } END { #print "" >> "cpu_usage_debug.txt"; print ""; } ' } calc_delta() { for proc_stat in "$1" "$2"; do proc_stat_parse "$proc_stat" done \ | awk ' { t = NR; for (i = 1; i <= (NF - 2); i += 3) { cpu_count[t]++; cpu_id = $i; # For occasional debugging total = $(i + 1); busy = $(i + 2); cpu[cpu_count[t], "total", t] = total; cpu[cpu_count[t], "busy" , t] = busy; } } END { for (c=1; c<=cpu_count[2]; c++) { total_1 = cpu[c, "total", 1]; total_2 = cpu[c, "total", 2]; busy_1 = cpu[c, "busy" , 1]; busy_2 = cpu[c, "busy" , 2]; total_d = total_2 - total_1; busy_d = busy_2 - busy_1; percent_busy = (busy_d / total_d) * 100; #printf(\ # "c: %d, total_1: %f total_2: %f, total_d: %f\n", # c, total_1, total_2, total_d \ #) >> "cpu_usage_debug.txt"; #printf(\ # "c: %d, busy_1: %f busy_2: %f, busy_d: %f\n", # c, busy_1, busy_2, busy_d \ #) >> "cpu_usage_debug.txt"; #printf(\ # "c: %d, percent_busy: %f\n", # c, percent_busy \ #) >> "cpu_usage_debug.txt"; if (c > 1) {printf " "}; out = sprintf("%3.0f%%", percent_busy) #printf "c: %d, out: %s\n", c, out >> "cpu_usage_debug.txt"; printf "%s", out; } #print "" >> "cpu_usage_debug.txt"; print ""; } ' } main() { last_proc_stat="$HOME/var/run/cpu_usage_from_proc_since_last_check/last_proc_stat" if [ ! -f "$last_proc_stat" ] then mkdir -p `dirname "$last_proc_stat"` cat /proc/stat > "$last_proc_stat" sleep 0.1 fi previous=`cat $last_proc_stat`; cat /proc/stat > "$last_proc_stat" current=`cat $last_proc_stat`; calc_delta "$previous" "$current" } main $@