# How to get overall CPU usage (e.g. 57%) on Linux

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.

• Jan 15, 2022 at 1:38
• Jan 18, 2022 at 18:15

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.0` compares system CPU times elapsed before and after the interval (blocking). When interval is `0.0` or `None` compares system CPU times elapsed since last call or module import, returning immediately. That means the first time this is called it will return a meaningless `0.0` value which you are supposed to ignore. In this case it is recommended for accuracy that this function be called with at least `0.1` seconds 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.0` or `None` it will return a meaningless `0.0` value which you are supposed to ignore.