About nixCraft

Shell script to watch the disk space

Posted by Vivek Gite [Last updated: August 16, 2007]

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% (download script):

#!/bin/sh
df -H | grep -vE '^Filesystem|tmpfs|cdrom' | awk '{ print $5 " " $1 }' | while read output;
do
  echo $output
  usep=$(echo $output | awk '{ print $1}' | cut -d'%' -f1  )
  partition=$(echo $output | awk '{ print $2 }' )
  if [ $usep -ge 90 ]; then
    echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
     mail -s "Alert: Almost out of disk space $usep%" you@somewhere.com
  fi
done

Setup Cron job

Save and install script as cronjob. Copy script to /etc/cron.daily/ (script downolad link)
# 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

Updated script version

Tony contributed and updated my script - You can exclude selected filesystem in case you don't want monitor all filesystems.

#!/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

Want to stay up to date with the latest Linux tips, news and announcements? Subscribe to our free e-mail newsletter or RSS feed to get all updates. You can Email this page to a friend.

You may also be interested in other helpful articles:

Discussion on This Article:

  1. Per Lindahl Says:

    I noticed that on devices that have very long path in some cases there might be a line break appended to the output and that will in turn create an error when the script is run like:

    line 22: [: -ge: unary operator expected

    To remove the line break just append “-P” to the “df” command.

    example:
    df -HlP

    (P) = adds posix compliance to the output.

    Errors that occured: df -H
    /dev/mapper/volume00-pgvol
    50G 31G 19G 62% /localhome/postgresql

    with -P
    /dev/mapper/volume00-pgvol 50G 31G 19G 62% /localhome/postgresql

    Also if you only have one type of filesystem that you need to monitor then add “-t ext3″ will only show EXT3 filesystems.

    Hope it helps.
    Regards,
    Per L

  2. nixcraft Says:

    Per Lindahl,

    Thanks for sharing your tip!

  3. Trula Says:

    Please show me if I need to get disk file last week or 10 days ago, what do I need to do?
    Thank you ~ Trula

  4. Mehmet Buyukozer Says:

    For my case:

    df -h | grep d30 | awk ‘{ print $5 ” ” $1 }’ | while read output;

    worked better. Thanks for shell script, life saver one.

  5. sorabh harit Says:

    HI

    thanks for script but i am getting following error
    on my solaris 9 servrer after executing the scipt.

    syntax error at line 5: `usep=$’ unexpected

    Regards

    Sorabh harit

  6. Niek Says:

    @sorabh harit:
    That is because you run a “real” Bourne shell, which doesn’t understand the syntax on that line.

    Also, there is a fair bit of double code at the end, and use of a function isn’t really necessary.

    I’ve put up a modified version on my site:
    http://www.qwertyboy.org/files/diskspace.txt

    Niek.

  7. Rohan Says:

    Can you please tell me how to find disk usage for a particular user only…!

  8. Derek Murphy Says:

    I tried using this script but I’m getting a syntax error, trying to run this on linux(redhat as 4) any thoughts?

    -bash-3.00$ ./diskscript.sh
    13% /dev/cciss/c0d0p2
    17% /dev/cciss/c0d0p1
    1% /dev/cciss/c0d0p5
    ./diskscript.sh: line 4: syntax error near unexpected token `do’
    ./diskscript.sh: line 4: `do’

    #!/bin/sh
    #df -H | grep -vE ‘^Filesystem|tmpfs|cdrom’ | awk ‘{ print $5 ” ” $1 }’ | while read output;
    df -F ext3 -k | grep -vE ‘^Filesystem|tmpfs|cdrom’ | awk ‘{print $5 ” ” $1}’
    do
    echo $output
    usep=$(echo $output | awk ‘{ print $1}’ | cut -d’%’ -f1 )
    partition=$(echo $output | awk ‘{ print $2 }’ )
    if [ $usep -ge 90 ]; then
    echo “Running out of space \”$partition ($usep%)\” on $(hostname) as on $(date)” |
    mail -s “Alert: Almost out of disk space $usep%” derek@iona.com
    fi
    done

  9. Hari Says:

    while executing the below script i am getting the following:

    Script:

    #!/bin/sh
    df -H | grep -vE ‘^Filesystem’ | awk ‘{ print $5 ” ” $1 }’ | while read output;
    do
    echo $output
    usep=$(echo $output | awk ‘{ print $1}’ | cut -d’%’ -f1 )
    partition=$(echo $output | awk ‘{ print $2 }’ )
    if [ $usep -ge 50 ]; then
    echo “Running out of space \”$partition ($usep%)\” on $(hostname) as on $(date)” |
    mail -s “Alert: Almost out of disk space $usep%” Hari-Krishna.Reddy@in.standardchartered.com
    fi
    done

    Error:

    sh diskAlert.sh
    /dev/mapper/rootvg-rootvol
    diskAlert.sh: line 7: [: /dev/mapper/rootvg-rootvol: integer expression expected
    / 4.2G
    diskAlert.sh: line 7: [: /: integer expression expected
    14% /dev/sda1
    0% none
    /dev/mapper/rootvg-homevol
    diskAlert.sh: line 7: [: /dev/mapper/rootvg-homevol: integer expression expected
    /home 2.1G
    diskAlert.sh: line 7: [: /home: integer expression expected
    /dev/mapper/rootvg-sharedvol
    diskAlert.sh: line 7: [: /dev/mapper/rootvg-sharedvol: integer expression expected
    /shared 6.3G
    diskAlert.sh: line 7: [: /shared: integer expression expected
    /dev/mapper/rootvg-varvol
    diskAlert.sh: line 7: [: /dev/mapper/rootvg-varvol: integer expression expected
    /var 2.1G
    diskAlert.sh: line 7: [: /var: integer expression expected

    can any one help me on this.

  10. Ambika Says:

    i want the disk space scripts where it should send the mail in the .lst file

  11. david Says:

    i am able to run the shell script properly but if i put it in a crontab its not working fine
    can anyone plz suggest me in this

    thnks
    david

Leave a Reply

We encourage your comments, and suggestions. But please stay on topic, be polite, and avoid spam. Thank you very much for stopping by our site!

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

*
To prove you're a person (not a spam script), type the security word shown in the picture. Click on the picture to hear an audio file of the word.
Click to hear an audio file of the anti-spam word

Tags: , , , , , , , ,

Copyright © 2004-2008 nixCraft. All rights reserved - TOS/Disclaimer - Privacy policy - Sitemap - Powered by Open source software.