How to watch the disk space with Shell Script

df displays the amount of disk space available on the file system containing each file name argument. If no file name is given, the space available on all currently mounted file systems is shown. Read man page of df if you are new to df command.

Steps

=> Find disk space using df

=> Filter out filesystem and find out the percentage of space using grep

=> Write a shell script

Step # 1: First get disk space:

$ df -H

Output:

Filesystem             Size   Used  Avail Use% Mounted on
/dev/hdb1               20G    14G   5.5G  71% /
tmpfs                  394M   4.1k   394M   1% /dev/shm
/dev/hdb5               29G    27G   654M  98% /nas/www

Step # 2: Next filter out filesystem and find out the percentage of space

$ df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }'

Output:

71% /dev/hdb1
98% /dev/hdb5

Step # 3: Write a shell script

Above command displays field 5 and 1 of df command. Now all you need to do is write a script to see if the percentage of space is >= 90%

#!/bin/sh
# set -x
# Shell script to monitor or watch the disk space
# It will send an email to $ADMIN, if the (free available) percentage of space is >= 90%.
# -------------------------------------------------------------------------
# Set admin email so that you can get email.
ADMIN="root"
# set alert level 90% is default
ALERT=90
# Exclude list of unwanted monitoring, if several partions then use "|" to separate the partitions.
# An example: EXCLUDE_LIST="/dev/hdd1|/dev/hdc5"
EXCLUDE_LIST="/auto/ripper"
#
#::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
#
function main_prog() {
while read output;
do
#echo $output
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1)
  partition=$(echo $output | awk '{print $2}')
  if [ $usep -ge $ALERT ] ; then
     echo "Running out of space \"$partition ($usep%)\" on server $(hostname), $(date)" | \
     mail -s "Alert: Almost out of disk space $usep%" $ADMIN
  fi
done
}

if [ "$EXCLUDE_LIST" != "" ] ; then
  df -H | grep -vE "^Filesystem|tmpfs|cdrom|${EXCLUDE_LIST}" | awk '{print $5 " " $6}' | main_prog
else
  df -H | grep -vE "^Filesystem|tmpfs|cdrom" | awk '{print $5 " " $6}' | main_prog
fi

Save and install script as cronjob. Copy script to /etc/cron.daily/
# cp diskAlert /etc/cron.daily/
# chmod +x /etc/cron.daily/diskAlert

OR install as cronjob:

crontab -e

Write cronjob as per your requirement

10 0 * * * /path/to/diskAlert


3 Responses to “How to watch the disk space with Shell Script”

  • Alex says:

    hello..

    what if your both partitions will run out of space? you will receive 2 mails. if you have more partitions, then you will receive more mails. how you do to receive all messages in one mail?

  • Brad says:

    Script fails on RedHat 5.5 with the following error:

    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /home: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /nfs/local: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /nfs/backups: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /misc/ksexton: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /misc/jlee: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /misc/ballison: integer expression expected
    ./disk_space_monitor: line 22: [: -ge: unary operator expected
    ./disk_space_monitor: line 22: [: /misc/sysops: integer expression expected

  • Gobinath says:

    Can anyone help me? I am getting the following error.

    # ./FS_Usage.sh
    ./FS_Usage.sh[16]: 0403-057 Syntax error at line 16 : `(‘ is not expected.
    #


Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title="" rel=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>