Monitor UNIX / Linux Server Disk Space with Shell Script

in Monitoring

Shell script to monitor or watch the disk space and send an email alert if the (free avilable) percentage of space is >= 90%

#!/bin/sh
# Shell script to monitor or watch the disk space
# It will send an email to $ADMIN, if the (free avilable) percentage
# of space is >= 90%
# -------------------------------------------------------------------------
# Copyright (c) 2005 nixCraft project <http://cyberciti.biz/fb/>
# This script is licensed under GNU GPL version 2.0 or above
# -------------------------------------------------------------------------
# This script is part of nixCraft shell script collection (NSSC)
# Visit http://bash.cyberciti.biz/ for more information.
# ----------------------------------------------------------------------
# Linux shell script to watch disk space (should work on other UNIX oses )
# SEE URL: http://www.cyberciti.biz/tips/shell-script-to-watch-the-disk-space.html
# set admin email so that you can get email
ADMIN="me@somewher.com"
# set alert level 90% is default
ALERT=90
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 $ALERT ]; then
    echo "Running out of space \"$partition ($usep%)\" on $(hostname) as on $(date)" |
     mail -s "Alert: Almost out of disk space $usep" $ADMIN
  fi
done
Want to read Linux tips and tricks, but don't have time to check our blog everyday? Subscribe to our email newsletter to make sure you don't miss a single tip/tricks.

{ 20 comments… read them below or add one }

Amit June 18, 2008 at 1:42 pm

Good Script

Reply

Eddie July 30, 2008 at 2:08 pm

Excellent, thanks!

I am trying to write one to monitor my Raid but having some issues with the regular expressions. Any ideas?

Cheers

Reply

vivek July 31, 2008 at 9:43 pm

What kind of issues you are having with regex?

Reply

JC October 15, 2008 at 8:01 am

Thanks for this excellent script !

I would just perform a “df -HP” so it would be safer : -P for Posix display to avoid bugs with the awk.

Cheers

Reply

adhitya christiawan nurprasetyo [dit] November 12, 2008 at 2:17 am

my server using another port of ssh,
can you tell me where to modify the script?
thank you…

Reply

xiaofu November 25, 2008 at 9:35 am

well done!

Reply

Caterpillar January 16, 2009 at 10:49 am

Super!!

Reply

FD January 18, 2009 at 6:35 am

The script looks simple and nice… but how to do run it on redhat? do I just put on specific folder? Cron job? please let me know..

Reply

Carl January 21, 2009 at 9:12 pm

I need help with this can anyone help
1) Create a subdirectory in /tmp and move multiple file(s) specified in the script argument to that directory.
2) Compress each of these files by calling a compression program.
3) Move the file(s) back to the original directory (after checking if under the disk quota).
4) Use a foreach loop to do this for each file one at a time.
4) Perform error checking

Reply

Tomeu Sastre January 22, 2009 at 10:52 am

Magnificent script.

I’ve seen that it has a little “bug”, because it throws an error because when doing the loop it finds a non numeric value due the header of the df command.

To resolve it I added this command to the line
grep / (that makes tot “grep” all that have the “/” symbols, that are relatet to volumens

and the results is :
df -H | grep / | grep -vE ‘^Filesystem|tmpfs|cdrom’ | awk ‘{ print $5 ” ” $1 }’

Reply

wah February 12, 2009 at 8:04 am

well done ^_^

Reply

vbavbalist February 12, 2009 at 8:15 am

How to exact use/put this script? Can you explain please . Using Redhat enterprise

Reply

hudipirlo February 18, 2009 at 2:59 am

hi vivik

if this script is run on the system lvm eror occurred, example

gareng:~ # df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 31G 2.6G 29G 9% /
tmpfs 4.0G 8.0K 4.0G 1% /dev/shm
/dev/sda1 134M 41M 93M 31% /boot
/dev/mapper/vgu01-lvu01
274G 91G 183G 34% /u01
/dev/mapper/vghome-lvhome
20G 288M 19G 2% /home
/dev/mapper/vgusr-lvusr
20G 6.6G 13G 35% /usr
/dev/mapper/vgtmp-lvtmp
15G 35M 15G 1% /tmp
/dev/sdc1 30G 15G 14G 52% /source
/dev/sdc2 491G 162G 305G 35% /oradb

i run scripts

gareng:~ # sh coba.sh
coba.sh: line 11: [: /dev/mapper/vgu01-lvu01: integer expression expected
coba.sh: line 11: [: /u01: integer expression expected
coba.sh: line 11: [: /dev/mapper/vghome-lvhome: integer expression expected
coba.sh: line 11: [: /home: integer expression expected
coba.sh: line 11: [: /dev/mapper/vgusr-lvusr: integer expression expected
coba.sh: line 11: [: /usr: integer expression expected
coba.sh: line 11: [: /dev/mapper/vgtmp-lvtmp: integer expression expected
coba.sh: line 11: [: /tmp: integer expression expected

i need your help

thanks

hudipirlo

Reply

dharjee March 10, 2009 at 2:36 pm

Hello

if I ran this script on my server it showed this error:
./diskspace: line 23: [: /dev/mapper/system-Xraid_5.4TB: integer expression expected
./diskspace: line 23: [: /xraid: integer expression expected

Please any suggestion?

Thanx

Reply

John Adams March 10, 2009 at 6:38 pm

I had a similar problem with a file system checker that I wrote.
I found that if I did a “df -P” then the LVM filesystem output would be on a single line and I could parse it. It seems the LVM filesystem names can be rather large and end up on two lines, causing confusion to the grep command..

Reply

Todd Allis March 25, 2009 at 11:50 pm

Thanks! I needed to change it to “df -HP” (Thanks, John Adams!), but then it worked fine. I incorporated it into an existing email notification script.

Reply

john May 5, 2009 at 2:34 pm

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?

Reply

Vivek Gite May 6, 2009 at 7:14 pm

You can modify script as follows:

#!/bin/bash
ADMIN="me@somewher.com"
# set alert level 90% is default
ALERT=90
# store all disk info here
DISKS="/tmp/out.df.$$"
echo "Running out of space on $(hostname) as on $(date)" > $DISKS
echo "" >> $DISKS
EMAIL=0
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 $ALERT ]; then
	echo "*** $partition ($usep%) ***" >>$DISKS
	EMAIL=1
  fi
done

[ "$EMAIL" == "1" ] && mail -s "Alert: Almost out of disk space $usep" $ADMIN < $DISKS

Reply

Stephen Adams June 15, 2009 at 12:03 am

Hi there,

Nice script. I modified it in the following way for my company

#!/bin/bash

#admin email account
ADMIN="admin@company.com"

# set usage alert threshold
THRESHOLD=40

#hostname
HOSTNAME=$(hostname)

#mail client
MAIL=/usr/bin/mail

# store all disk info here
EMAIL=""

for line in $(df -hP | egrep '^/dev/' | awk '{ print $6 "_:_" $5 }')
do

	part=$(echo "$line" | awk -F"_:_" '{ print $1 }')
	part_usage=$(echo "$line" | awk -F"_:_" '{ print $2 }' | cut -d'%' -f1 )

	if [ $part_usage -ge $THRESHOLD -a -z "$EMAIL" ];
	then
		EMAIL="$(date): Running out of diskspace on $HOSTNAME\n"
		EMAIL="$EMAIL\n$part ($part_usage%) >= (Threshold = $THRESHOLD%)"

	elif [ $part_usage -ge $THRESHOLD ];
	then
		EMAIL="$EMAIL\n$part ($part_usage%) >= (Threshold = $THRESHOLD%)"
	fi
done 

if [ -n "$EMAIL" ];
then
	echo -e "$EMAIL" | $MAIL -s "Alert: Partition(s) almost out of diskspace on $HOSTNAME" "$ADMIN"
fi

Reply

Vivek Gite June 15, 2009 at 5:37 am

Thanks for sharing the code. I’ve updated your post with pre tags.

Reply

Leave a Comment

Previous post: UNIX / Linux Shell Script For Monitoring System network with ping command

Next post: Shell Script To Monitor Services Such As Web / Http, Ssh, Mail Server