15

I want to display Memory usage, Disk Usage and CPU Load in the following format:

Memory Usage: 33/512MB (6%)    
Disk usage: 4.2/20GB (23%) 
CPU Load: 0.01

How do I do that?

  • Looks a lot like homework. Grab the data you need from /proc itself or from other commands then format it with awk, perl, or just bash. – mikebabcock Mar 11 '14 at 13:25
  • Welcome to Unix & Linux Stack Exchange! Please always include your OS. Solutions very often depend on the Operating System being used. Are you using Unix, Linux, BSD, OSX, something else? Which version? – terdon Mar 11 '14 at 16:26
  • Thanks guys for your help. However, I got my answer here stackoverflow.com/questions/33774260/… – Mohsin Inayat Khan Nov 18 '15 at 8:55
33

Try this, it works on my Debian system. The details may vary depending on the implementation of these tools that your OS uses:

#!/bin/sh
free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }'
df -h | awk '$NF=="/"{printf "Disk Usage: %d/%dGB (%s)\n", $3,$2,$5}'
top -bn1 | grep load | awk '{printf "CPU Load: %.2f\n", $(NF-2)}' 

If you save the above as a script and run it, you will get (example from my system):

$ ./foo.sh 
Memory Usage: 4986/7994MB (62.37%)
Disk Usage: 23/68GB (35%)
CPU Load: 0.78

Note that the script above is giving the disk usage for the / partition. You did not specify what you wanted so I'm guessing that's what you're after.

  • 1
    I tried with only awk github.com/rahulinux/scripts/blob/master/sys_info.sh – Rahul Patil Mar 11 '14 at 17:31
  • @RahulPatil looks good, why don't you post it? – terdon Mar 11 '14 at 18:00
  • 3
    because it's just your copied ans. :D – Rahul Patil Mar 12 '14 at 4:42
  • 1
    the free -m line does give me a error, the percentage was not properly escaped. this is how it should be: free -m | awk 'NR==2{printf "Memory Usage: %s/%sMB (%.2f%%)\n", $3,$2,$3*100/$2 }' – simon Dec 10 '15 at 21:17
  • 1
    @user1735921 Please ask a question. But first, google how to store the output of a command in a variable, that is trivial. Then, explain what you want to store and what you want to test in the question. – terdon Mar 16 '17 at 13:09
5

Check atop.

Read this, https://lwn.net/Articles/387202/

See, enter image description here

You can see load of disk / memory / cpu by apps:

enter image description here

For example, disk usage:

enter image description here

atop gathered statistics in the directory /var/log/atop/ in binary format files per days. You could read a man page, there must be a way to extract useful information.

2

There's not a command to display exactly in your particular format, but the following provide some of the base values, which one could build a script around, as an alternative it's also possible to read values from /proc and /sys.

free - quick overview

vmstat 1 shows system performance i/o stats

top dynamic

htop similar to top

  • 1
    Throw in my personal favourite, iostat. – mikebabcock Mar 11 '14 at 13:24
0

I think you need nagios help, for all this plugins/srcipts for nagios are already made and you can download and test without nagios installation.

0

If you are using solaris, check this out: showcpucount

This will give you an idea of how to go about writing your code.

  • Blog no longer exists. – Jay Elston Feb 25 at 14:39
0

Here is my code for getting CPU and RAM usage:

### 1. get total average CPU usage for the past minute
avg_cpu_use=$(uptime)
# a. split response
IFS=',' read -ra avg_cpu_use_arr <<< "$avg_cpu_use"
# b. find cpu usage
avg_cpu_use=""
for i in "${avg_cpu_use_arr[@]}"; do :
    if [[ $i == *"load average"* ]]; then
        avg_cpu_use=$i
        break       
    fi
done
# c. create response
avg_cpu_use=$(echo ${avg_cpu_use:16})   # Remove "  load average: "
if [[ -z "${avg_cpu_use// }" ]]; then
    avg_cpu_use="CPU: N/A%%"
    exit -1
else
    avg_cpu_use="CPU: ${avg_cpu_use}%%"
fi

### 2. get RAM usage
ram_use=$(free -m)
# a. split response by new lines
IFS=$'\n' read -rd '' -a ram_use_arr <<< "$ram_use"
# b. remove extra spaces
ram_use="${ram_use_arr[1]}"
ram_use=$(echo "$ram_use" | tr -s " ")
# c. split response by spaces
IFS=' ' read -ra ram_use_arr <<< "$ram_use"
# d. get variables
total_ram="${ram_use_arr[1]}"
ram_use="${ram_use_arr[2]}"
# e. create response
ram_use="RAM: ${ram_use}/${total_ram} MB"

echo $avg_cpu_use
echo $ram_use
-2

You should be able to display Memory usage, Disk Usage and CPU Load using:

(ps hax -o rss,user | awk '{a[$2]+=$1;}END{for(i in a)print i" "int(a[i]/1024+0.5);}' | sort -rnk2)

protected by Anthon Sep 18 '17 at 13:37

Thank you for your interest in this question. Because it has attracted low-quality or spam answers that had to be removed, posting an answer now requires 10 reputation on this site (the association bonus does not count).

Would you like to answer one of these unanswered questions instead?

Not the answer you're looking for? Browse other questions tagged or ask your own question.