#!/bin/sh if [ "$1" = "-h" ]; then cat <&2 Usage: ${0##*/} Return the CPU usage. Linux only. EOF exit fi if [ ! "$(uname)" = "Linux" ]; then echo >&2 "Linux only." exit 1 fi ## CPU usage ## ## A typical CPU array is (on Linux Kernel 3.0) ## cpu 158150 0 52354 18562746 1472 0 10198 0 0 0 ## ## The meanings of the columns are as follows, from left to right: ## ## user: normal processes executing in user mode ## nice: niced processes executing in user mode ## system: processes executing in kernel mode ## idle: twiddling thumbs ## iowait: waiting for I/O to complete ## irq: servicing interrupts ## softirq: servicing softirqs ## ... (see 'man 5 proc' for further details) ## ## Only the first 4 values are interesting here. cpuarray="$(grep '^cpu ' /proc/stat)" ## We start at field #3 since there are 2 spaces after 'cpu'. f1=$(echo "$cpuarray" | cut -f3 -d' ') f2=$(echo "$cpuarray" | cut -f4 -d' ') f3=$(echo "$cpuarray" | cut -f5 -d' ') f4=$(echo "$cpuarray" | cut -f6 -d' ') totalA=$((f1+f2+f3+f4)) idleA=$f4 sleep 1 cpuarray="$(grep '^cpu ' /proc/stat)" f1=$(echo "$cpuarray" | cut -f3 -d' ') f2=$(echo "$cpuarray" | cut -f4 -d' ') f3=$(echo "$cpuarray" | cut -f5 -d' ') f4=$(echo "$cpuarray" | cut -f6 -d' ') totalB=$((f1+f2+f3+f4)) idleB=$f4 totaldiff=$((${totalB:-0}-${totalA:-0})) if [ $totaldiff -eq 0 ]; then echo 0 else echo "$((100 - 100 * (idleB-idleA) / totaldiff))" fi