On Tue, May 05, 2009 at 06:50:07PM +0100, Alexander Clouter wrote:
Eugh, that truly is horrible.

Have a look at /proc/stat and section 1.8 of Documentation/filesystems/proc.txt in the Linux kernel tree.

You're right, but I don't think /proc/stat is especially useful. It requires too much processing for a script. I've lately used iostat, because it gives me disk useage information along with CPU usage. The attached script is fairly arcane, but most of it goes towards determining the background/foreground color for a given usage.

To be honest, getting CPU 'usage' is pretty pointless as it's either busy, idle or busy waiting on IO. You should be using loadavg really as instantaneous CPU usage tells you nothing.

I don't agree. I have my load averages in my bar, but I still generally find immediate CPU usage statistics more useful. Load averages are probably useful for servers, but for my workstations, I like to know fairly immediately when something starts using a lot of CPU time, and I find my brain more than apt at guessing just how loaded my system is based on those data. As for load averages, I have to wait at least 30 seconds before I begin to see the effect of any runaway process, and the value never seems to be of nearly as much use to me as the CPU utilization percentage.

--
Kris Maglione

You do not really understand something unless you can explain it to
your grandmother.
        --Albert Einstein

#!/bin/rc
# ©2006 Kris Maglione <fbsdae...@gmail.com>
#
# You may do whatever you like with this script, as long as the
# above copyright notice remains. The BSD-Lite disclaimers apply.
. 9.rc
. wmii.rc rc.ios

if(~ $1 -x)
        fn wmiir {
                shift; bar=$1 {
                shift 4
                echo $bar $*
                }
        }

# Set this to the update interval
interval=1

# Bar Names
bar_cpu=s3cpu
bar_io=s4io
bars=($bar_cpu $bar_io)

# End Configuration

fn sigterm sigint {
        for(i in $bars $bar_time)
                wmiir remove /bar/$i >[2]/dev/null
        exit
}

fn m {hoc -e $"*}

for(i in ($bars $bar_time))
        wmiir remove /rbar/$i >[2]/dev/null
sleep `{m $interval + 1}
for (i in $bars)
        echo -n $wmiinormcol | wmiir create /rbar/$i

fn tuple {
        a=$(wmii$1^col); idx=$2
        h = `{echo $a($idx) | tr 'a-f' 'A-F' | sed 's/#//; s/../& /g'}
        echo 16i $h^p | 9 dc
}
normbg=`{tuple norm 2}
selbg=`{tuple focus 2}
normbr=`{tuple norm 3}
selbr=`{tuple focus 3}

fn col {
        n=$1; rat=$2; a=$(norm$3); b=$(sel$3); shift 3
        m 'int(('$b($n) - $a($n)')' '*' $rat + $a($n)')'
}

fn cols {
        val=$1; max=$2; ary=$3; shift 3
        if(~ `{m $max - $val} -*)
                val = $max
        rat = `{m $val / $max}
        printf '#%02x%02x%02x' `{col 1 $rat $ary} `{col 2 $rat $ary} `{col 3 
$rat $ary}
}

iostat -c $interval | sed -l 1d | awk 'NR%3 == 0{print;fflush()}' |
while(*=`{read}) {

        us=$1; ni=$2; sy=$3; await=$4; steal=$5; idle=$6
        to=`{m 'int('$us + $sy')'}

        fg = '#000000'

        bg = `{cols $"to 100 bg}
        br = `{cols $"to 100 br}
        
        *=`{m print 'int('^($to $us $sy $ni)^'),' 0}
        wmiir xwrite /rbar/$bar_cpu >[2]/dev/null \
                $fg $bg $br $1:$2+$3 $4 \
                || exit

        bg = `{cols $await 15 bg}
        br = `{cols $await 15 br}
        
        wmiir xwrite /rbar/$bar_io >[2]/dev/null \
                $fg $bg $br $await \
                || exit
}

Reply via email to