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
fiSave 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

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?
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
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.
#