Wednesday, October 05, 2005

Disk usage monitoring

Disk usage monitoring

Takeaway:
Learn to use scripting and cron to run regular scripts that will
monitor your disk space.

advertisement

Monitoring disk usage is a critical part of running any server. There
is nothing worse than having a runaway process or malicious user fill
up a filesystem only to find out about it when the boss calls to
indicate she can't connect to or write to the server. With a little
bit of shell scripting and cron usage, you can have a script run every
hour or at any other interval that will indicate if you need to be
concerned about disk space filling up.

The script itself is very small:

<code>

#!/bin/sh

fs=`mount|egrep '^/dev'|grep -iv cdrom| awk '{print $3}'`

typeset -i thresh="90"

typeset -i warn="95"

for i in $fs

do

skip=0

typeset -i used=`df -k $i|tail -1|awk '{print $5}'|cut -d "%" -f 1`

if [ "$used" -ge "$warn" ]; then

echo "CRITICAL: filesystem $i is $used% full"

fi

if [ "$used" -ge "$thresh" -a "$used" -le "$warn" ]; then

echo "WARNING: filesystem $i is $used %full"

fi

done

</code>

The first thing the script does is get the list of mount points from
the mount program and filters out any mounted CD-rom drives. It also
doesn't take into account any special file systems like /proc or /sys
by making sure the mount point device is an actual device (by making
sure the device name starts with /dev).

Next, set your threshold to something sensible, like 90% full. Adjust
this to taste; this just generates a warning. Likewise, you set your
critical warning value to 95%. Notice that the command typeset -i is
used to ensure that bash treats these numbers as integers, which you
need for comparing the values obtained from df.

The $used variable gets set on each filesystem with the Use% column
output from the df tool. This is compared to your thresholds.

The script simply outputs the warnings to standard output. The script
can easily be adjusted to have it send an e-mail to someone should one
of the thresholds be breached. To have this executed every 30 minutes
via cron, edit the system crontab to include:

<code>

0,30 * * * * * /usr/local/bin/diskmon.sh

</code>

In this case, all the warnings will be sent via cron to whoever
receives cron's output mails.

0 Comments:

Post a Comment

<< Home