#!/bin/bash # ############################################################################### # Author : Louwrentius + Mortal # Contact : louwrentius@gmail.com + mortal_dojo@mateu.be # Initial release : August 2011 # Licence : Simplified BSD License ############################################################################### VERSION=1.02 # # Mounted volume to be monitored. # MOUNT="$1" # # Maximum threshold of volume used as an integer that represents a percentage: # 95 = 95%. # MAX_USAGE="$2" # # Failsafe mechansim. Delete a maxium of MAX_CYCLES files, raise an error after # that. Prevents possible runaway script. Disable by choosing a high value. # MAX_CYCLES=100 reset () { CYCLES=0 OLDEST_FILE="" OLDEST_DATE=0 ARCH=`uname` } reset if [ -z "$MOUNT" ] || [ ! -e "$MOUNT" ] || [ ! -d "$MOUNT" ] || [ -z "$MAX_USAGE" ] then echo "Usage: $0 " echo "Where threshold is a percentage." echo echo "Example: $0 /storage 90" echo "If disk usage of /storage exceeds 90% the oldest" echo "file(s) will be deleted until usage is below 90%." echo echo "Wrong command line arguments or another error:" echo echo "- Directory not provided as argument or" echo "- Directory does not exist or" echo "- Argument is not a directory or" echo "- no/wrong percentage supplied as argument." echo exit 1 fi check_capacity () { USAGE=`df -h | grep "$MOUNT" | awk '{ print $5 }' | sed s/%//g` if [ ! "$?" == "0" ] then echo "Error: mountpoint $MOUNT not found in df output." exit 1 fi if [ -z "$USAGE" ] then echo "Didn't get usage information of $MOUNT" echo "Mountpoint does not exist or please remove trailing slash." exit 1 fi if [ "$USAGE" -gt "$MAX_USAGE" ] then echo "Usage of $USAGE% exceeded limit of $MAX_USAGE percent." return 0 else echo "Usage of $USAGE% is within limit of $MAX_USAGE percent." return 1 fi } process_file () { FILE="$1" # # Replace the following commands with wathever you want to do with # this file. You can delete files but also move files or do something else. # echo "Deleting oldest file $FILE" rm -f "$FILE" } while check_capacity do if [ "$CYCLES" -gt "$MAX_CYCLES" ] then echo "Error: after $MAX_CYCLES deleted files still not enough free space." exit 1 fi FILE=`find "$MOUNT" -type f -printf '%T+ %p\n' | sort | head -n 1 | cut -d ' ' -f 2` process_file "$FILE" ((CYCLES++)) done # Delete empty directories while we’re at it find "$MOUNT" -type d -empty -delete echo