My original query ------------------ > Does anyone have a nice script that automatically emails the users who are > taking up the majority of space on a disk which is close to capacity? > Currently I have to run :- > mymachine> du -ks /home/ermintrude/* | sort -nr | head > and email the users manually. I'm using the general threshold of > 95% before I warn users to clean-up. My thanks go to the following for their contributions ---------------------------------------------------- Peter Duncan, Ron Dinwiddie, Bertrand Hutin, David Glass, Randy Romero, Thomas Knox, Jim M., Gary Mulder, Robert Reynolds, Jim Lang, Suresh Vuthamaraju + anybody else that may contribute after this summary. The scripts ----------- A few asked whether I was using quotas on my systems, the answer is no, and we are unlikely to in the future. I intend to play with the scripts received over the next few days and then settle on the one. Note that some will just mail the admin, not the users themselves (latter preferred). The ones included below look the most interesting ;-) Script 1 -------- # Set up variable for who is to be mailed ADMIN_MAIL="unixadmin@globalfarmers.com" # The maximum percent that the disk slices are allowed to grow to MAXSIZE=95 # The Command to check the disks and strip out unwanted variables DISKSIZES=`df -k |grep / |awk '{print $5}' |sed -e 's/\%//'` # Take the input from the df command above for percent in $DISKSIZES do # If the percent is greater than the maximum percent that the disk slices are allowed to grow to if [ $percent -gt $MAXSIZE ] then # Mail a df -k to the specified person(s) df -k | mailx -s "Disk Space Problem on 'nodename' " $ADMIN_MAIL fi done Script 2 -------- #! /usr/bin/ksh DIR=/ADC/sys HOST=`hostname` /usr/bin/df -k | /usr/bin/awk '{print $6 " " $5}' | sed '/%/s// /g' > $DIR/fs_usage echo "The following file system/s is/are getting dangerously low on disk space on system: " $HOST > $DIR/$HOST.usagemail for size in $DIR/fs_usage do cat $size | \ while read line do /usr/bin/awk '$2 >= 90' >> $DIR/$HOST.usagemail done done cat $DIR/$HOST.usagemail | /usr/bin/mailx -s "Filesystem Usage" whoever@email-address.com,another-user-if-you-want@email-address.com Script 3 -------- for i in `du -ks /home/ermintrude/* | sort -nr | head | awk '{print $2}'` do mailx -s "Clean up your directory" $i done Script 4 -------- #!/usr/bin/ksh # This script will check a list of drives to determine if they are below # a specified threshold. If they are, it will send an email alert. # This script is designed to be called by cron, and execute quickly. # Uncomment the next line for debugging info. #set -o xtrace # Which machine am I running on? HOSTNAME=`uname -n` # Whom do I send alerts to? MAILTO="me@mycompany.com you@yourcompany.com" # What file contains the drive thresholds? THRESHOLD=/usr/local/etc/threshold_list # Read the list of drives to check, one at a time. while read DRIVE LLIMIT do # Determine if we're looking for a % or a fixed number DRVPCT=${LLIMIT%'%'} if [ "$LLIMIT" = "$DRVPCT" ]; then # Get the number of Kilobytes free on the drive: let NUMFREE=`df -k | grep $DRIVE | nawk '{ print $4 }'` MYDRIVE=`df -k | grep $DRIVE | nawk '{ print $6 }'` if [ "$NUMFREE" -lt "$LLIMIT" ]; then echo There is only $NUMFREE K free on $HOSTNAME:$MYDRIVE | \ mailx -s "Urgent: freespace on $HOSTNAME" $MAILTO fi else # Get the % used of the drive let NUMFREE=`df -k | grep $DRIVE | nawk '{ print $5 }' | cut -f1 -d\%` MYDRIVE=`df -k | grep $DRIVE | nawk '{ print $6 }'` if [ "$DRVPCT" -lt "$NUMFREE" ]; then let TOTFREE="100-$NUMFREE" echo There is only $TOTFREE % free on $HOSTNAME:$MYDRIVE | \ mailx -s "Urgent: freespace on $HOSTNAME" $MAILTO fi fi # Check the next drive in the list done < $THRESHOLD /usr/local/etc/threshold_list: / 95% /var 131282 Script 5 -------- #!/bin/sh # temporary working file USERLIST=/tmp/userlist$$ # WARNSIZE is the high water mark in KB before we send an e-mail # in this case 1GB WARNSIZE=`expr 1024 \* 1024` # check whether we're using NIS or /etc/passwd # needs to be modified to use niscat if NIS+ is being used /usr/bin/ypwhich > /dev/null 2>&1 if [ $? -eq 0 ] then /usr/bin/ypcat passwd | /usr/bin/awk -F\: '{print $1 ":" $6}' > $USERLIST else awk -F\: '{print $1 ":" $6}' /etc/passwd > $USERLIST fi # loop through each user in $USERLIST and check his or her disk usage for USER in `cat $USERLIST` do NAME=`echo $USER | /usr/bin/awk -F\: '{print $1}'` HOMEDIR=`echo $USER | /usr/bin/awk -F\: '{print $2}'` SIZE=`/usr/bin/du -ks $HOMEDIR | /usr/bin/awk '{print $1}'` if [ $SIZE -gt $WARNSIZE ] then /usr/bin/mailx -s "You have reached $WARNSIZE Kilobytes of disk usage" $NAME << !! Dear ${NAME}, Please delete unneccesary files as you are using $SIZE Kilobytes of disk space in $HOMEDIR. Thanks, System Admin !! fi done /usr/bin/rm -f $USERLIST Script 6 -------- #!/bin/sh # # Check various system parameters and send an e-mail if there are problems # Dave Tarbatt 23/07/2000 # Version 1.0 # Version 1.1 -- added check for inodes # Version 1.2 -- added autodetect non-Linux nodes (for df -i) # # Global parameters EMAIL="steven.briggs@autotrader.co.uk, robert.reynolds@autotrader.co.uk" # where to send errors to HOSTNAME=`/bin/hostname` # what host am I UNAME=`uname` # what type of system am I ERRORMESSAGE= # variable to hold e-mail body # CHECK#1 parameters -- low disk/inode space check # Define list of partitions and their upper percentage threshold PARTITIONSPACE="/dev/dsk/c0t0d0s0=10" INODESPACE="/dev/dsk/c0t0d0s0=80" CHECK1ERROR= # variable to hold check#1 e-mail body # CHECK#2 parameters -- monitored process check # Define list of processess that should always be running PROCESSES="sshd httpd" CHECK2ERROR= # variable to hold check#2 e-mail body ############################################################################ ### # CHECK#1 -- low disk/inode space check ############################################################################ ### DATE=`/bin/date` # start time of check for DFDATA in `/bin/df -k|grep -v "Filesystem|proc"|sed "s/%//g"|awk '{print $1"="$4"="$5"="$6}'` ; do DFDEVICE=`echo $DFDATA | cut -f1 -d=` # get device name DFKSPACE=`echo $DFDATA | cut -f2 -d=` # get space in KB DFPSPACE=`echo $DFDATA | cut -f3 -d=` # get space in % DFMOUNT=`echo $DFDATA | cut -f4 -d=` # get the mount point for PARTITION in $PARTITIONSPACE ; do DEVICE=`echo $PARTITION | cut -f1 -d=` # get device name to check DEVICETHRESH=`echo $PARTITION | cut -f2 -d=` # get device threshold if [ $DFDEVICE = $DEVICE ] ; then if [ $DFPSPACE -ge $DEVICETHRESH ] ; then CHECK1ERROR=$CHECK1ERROR`echo "\n$DFDEVICE mounted on $DFMOUNT only $DFKSPACE KB free ($DFPSPACE% full)"` fi fi done done for DFDATA in `/bin/df -k|grep -v "Filesystem|proc"|sed "s/%//g"|if [ $UNAME = "SunOS" ] ; then awk '{print $1"="$4"="$5"="$6}' ; else awk '{print $1"="$7"="$8"="$9}' ; fi` ; do DFDEVICE=`echo $DFDATA | cut -f1 -d=` # get device name DFISPACE=`echo $DFDATA | cut -f2 -d=` # get inodes available DFPSPACE=`echo $DFDATA | cut -f3 -d=` # get inodes in % DFMOUNT=`echo $DFDATA | cut -f4 -d=` # get the mount point for INODE in $INODESPACE ; do DEVICE=`echo $INODE | cut -f1 -d=` # get device name to check DEVICETHRESH=`echo $INODE | cut -f2 -d=` # get device threshold if [ $DFDEVICE = $DEVICE ] ; then if [ $DFPSPACE -ge $DEVICETHRESH ] ; then CHECK1ERROR=$CHECK1ERROR`echo "\n$DFDEVICE mounted on $DFMOUNT only $DFISPACE free inodes ($DFPSPACE% used)"` fi fi done done if [ "$CHECK1ERROR" != "" ] ; then ERRORMESSAGE=$ERRORMESSAGE`echo "\n\nLOW DISK SPACE WARNING ($DATE): $CHECK1ERROR"` fi ############################################################################ ### # CHECK#2 -- monitored process check ############################################################################ ### DATE=`/bin/date` # start time of check for PROCESS in $PROCESSES ; do /bin/ps -aefuwww|grep -v grep|grep $PROCESS > /dev/null if [ $? -ne 0 ] ; then CHECK2ERROR=$CHECK2ERROR`echo "\nMonitored process $PROCESS is not running"` fi done if [ "$CHECK2ERROR" != "" ] ; then ERRORMESSAGE=$ERRORMESSAGE`echo "\n\nMONITORED PROCESSES ERROR ($DATE): $CHECK2ERROR"` fi ############################################################################ ### # End of checks. If there were any problems, e-mail them ############################################################################ ### if [ "$ERRORMESSAGE" != "" ] ; then echo "$ERRORMESSAGE"|mail "HealthCheck: $HOSTNAME problems" $EMAIL fi ---------- Regards ---- Mark .I. Mahabir (XMM SSC Computer Operator) Dept of Physics & Astronomy, University of Leicester, Phone +44 116 252 5652 Leicester, LE1 7RH, U.K. Fax +44 116 252 3311 _______________________________________________ sunmanagers mailing list sunmanagers@sunmanagers.org http://www.sunmanagers.org/mailman/listinfo/sunmanagersReceived on Thu Nov 29 13:58:22 2001
This archive was generated by hypermail 2.1.8 : Thu Mar 03 2016 - 06:42:29 EST