I am wondering how you can get the system CPU usage and present it in percent using bash, for example.
Sample output:
57% In case there is more than one core, it would be nice if an average percentage could be calculated.
Take a look at cat /proc/stat
grep 'cpu ' /proc/stat | awk '{usage=($2+$4)*100/($2+$4+$5)} END {print usage "%"}'
EDIT please read comments before copy-paste this or using this for any serious work. This was not tested nor used, it's an idea for people who do not want to install a utility or for something that works in any distribution. Some people think you can "apt-get install" anything.
NOTE: this is not the current CPU usage, but the overall CPU usage in all the cores since the system bootup. This could be very different from the current CPU usage. To get the current value top (or similar tool) must be used.
Current CPU usage can be potentially calculated with:
awk '{u=$2+$4; t=$2+$4+$5; if (NR==1){u1=u; t1=t;} else print ($2+$4-u1) * 100 / (t-t1) "%"; }' \ <(grep 'cpu ' /proc/stat) <(sleep 1;grep 'cpu ' /proc/stat) /proc/statYou can try:
top -bn1 | grep "Cpu(s)" | \ sed "s/.*, *\([0-9.]*\)%* id.*/\1/" | \ awk '{print 100 - $1"%"}' 32.7%).top -bn2, but it takes a long time. From what I've read, this seems to be the only way to get an accurate result.top -bn1 seems wildly inaccurate on my FC20 system. top -bn2 seems to work well.top -v returns procps-ng (e.g., Fedora). There's also procps, found on, e.g., Ubuntu and CentOS, where the command doesn't work (always indicates 100%, because parsing fails due to the line with the CPU figures being formatted differently). Here's a version that works with both implementations: top -b -n2 -p 1 | fgrep "Cpu(s)" | tail -1 | awk -F'id,' -v prefix="$prefix" '{ split($1, vs, ","); v=vs[length(vs)]; sub("%", "", v); printf "%s%.1f%%\n", prefix, 100 - v }'top -l 2 -n 0 -F | egrep -o ' \d*\.\d+% idle' | tail -1 | awk -F% -v prefix="$prefix" '{ printf "%s%.1f%%\n", prefix, 100 - $1 }'.Try mpstat from the sysstat package
> sudo apt-get install sysstat Linux 3.0.0-13-generic (ws025) 02/10/2012 _x86_64_ (2 CPU) 03:33:26 PM CPU %usr %nice %sys %iowait %irq %soft %steal %guest %idle 03:33:26 PM all 2.39 0.04 0.19 0.34 0.00 0.01 0.00 0.00 97.03 Then some cutor grepto parse the info you need:
mpstat | grep -A 5 "%idle" | tail -n 1 | awk -F " " '{print 100 - $ 12}'a awk part to: awk -F " " '{print (100 - $12)"%"}', which gives the output formatted like he wanted, but otherwise this looks good to me.mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12 }'Might as well throw up an actual response with my solution, which was inspired by Peter Liljenberg's:
$ mpstat | awk '$12 ~ /[0-9.]+/ { print 100 - $12"%" }' 0.75% This will use awk to print out 100 minus the 12th field (idle), with a percentage sign after it. awk will only do this for a line where the 12th field has numbers and dots only ($12 ~ /[0-9]+/).
You can also average five samples, one second apart:
$ mpstat 1 5 | awk 'END{print 100-$NF"%"}' Test it like this:
$ mpstat 1 5 | tee /dev/tty | awk 'END{print 100-$NF"%"}' conky is displaying as well. Unfortunately, this line is VERY slow, almost taking up to one whole second to execute.Do this to see the overall CPU usage. This calls python3 and uses the cross-platform psutil module.
printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3 The interval=2 part says to measure the total CPU load over a blocking period of 2 seconds.
Sample output:
9.4% The python program it contains is this:
import psutil print('{}%'.format(psutil.cpu_percent(interval=2))) Placing time in front of the call proves it takes the specified interval time of about 2 seconds in this case. Here is the call and output:
$ time printf "%b" "import psutil\nprint('{}%'.format(psutil.cpu_percent(interval=2)))" | python3 9.5% real 0m2.127s user 0m0.119s sys 0m0.008s To view the output for individual cores as well, let's use this python program below. First, I obtain a python list (array) of "per CPU" information, then I average everything in that list to get a "total % CPU" type value. Then I print the total and the individual core percents.
Python program:
import psutil cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True) avg = sum(cpu_percent_cores)/len(cpu_percent_cores) cpu_percent_total_str = ('%.2f' % avg) + '%' cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores] print('Total: {}'.format(cpu_percent_total_str)) print('Individual CPUs: {}'.format(' '.join(cpu_percent_cores_str))) This can be wrapped up into an incredibly ugly 1-line bash script like this if you like. I had to be sure to use only single quotes (''), NOT double quotes ("") in the Python program in order to make this wrapping into a bash 1-liner work:
printf "%b" \ "\ import psutil\n\ cpu_percent_cores = psutil.cpu_percent(interval=2, percpu=True)\n\ avg = sum(cpu_percent_cores)/len(cpu_percent_cores)\n\ cpu_percent_total_str = ('%.2f' % avg) + '%'\n\ cpu_percent_cores_str = [('%.2f' % x) + '%' for x in cpu_percent_cores]\n\ print('Total: {}'.format(cpu_percent_total_str))\n\ print('Individual CPUs: {}'.format(' '.join(cpu_percent_cores_str)))\n\ " | python3 Sample output: notice that I have 8 cores, so there are 8 numbers after "Individual CPUs:":
Total: 10.15% Individual CPUs: 11.00% 8.50% 11.90% 8.50% 9.90% 7.60% 11.50% 12.30% For more information on how the psutil.cpu_percent(interval=2) python call works, see the official psutil.cpu_percent(interval=None, percpu=False) documentation here:
psutil.cpu_percent(interval=None, percpu=False)Return a float representing the current system-wide CPU utilization as a percentage. When interval is >
0.0compares system CPU times elapsed before and after the interval (blocking). When interval is0.0orNonecompares system CPU times elapsed since last call or module import, returning immediately. That means the first time this is called it will return a meaningless0.0value which you are supposed to ignore. In this case it is recommended for accuracy that this function be called with at least0.1seconds between calls. When percpu is True returns a list of floats representing the utilization as a percentage for each CPU. First element of the list refers to first CPU, second element to second CPU and so on. The order of the list is consistent across calls.Warning: the first time this function is called with interval =
0.0orNoneit will return a meaningless0.0value which you are supposed to ignore.
Going further:
I use the above code in my cpu_logger.py script in my eRCaGuy_dotfiles repo.
EDITED: I noticed that in another user's reply %idle was field 12 instead of field 11. The awk has been updated to account for the %idle field being variable.
This should get you the desired output:
mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { print 100 - $field }' If you want a simple integer rounding, you can use printf:
mpstat | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d%%",100 - $field) }' mpstat 1 1 | awk '$3 ~ /CPU/ { for(i=1;i<=NF;i++) { if ($i ~ /%idle/) field=i } } $3 ~ /all/ { printf("%d",100 - $field) }' works great for me, thanks. note the mpstat 1 1 to ensure that the cpu usage is sampled over a secondmpstat -o JSON -u 1 1 | jq '.sysstat.hosts[0].statistics[0]["cpu-load"][0].idle'
ps -A -o pcpu | tail -n+2 | paste -sd+ | bc/proc/statis very limited, but this one-liner works good enough for me:cat <(grep 'cpu ' /proc/stat) <(sleep 1 && grep 'cpu ' /proc/stat) | awk -v RS="" '{printf "%.2f%\n", ($13-$2+$15-$4)*100/($13-$2+$15-$4+$16-$5)}'. With %.2f you can control the number of decimals you want to output, and withsleep 1you can set the time you want to average over, that is, if it does what I think it does. You can put it in a bash while loop, to test it in realtime.{ head -n1 /proc/stat;sleep 0.2;head -n1 /proc/stat; } | awk '/^cpu /{u=$2-u;s=$4-s;i=$5-i;w=$6-w}END{print int(0.5+100*(u+s+w)/(u+s+i+w))}'Which gives the average cpu percentage over the given delay (in this example set to 200ms), returned in rounded int value (but you can also leave out theint(0.5+part).