Monster Finder to haunt your disk...

No-User%Bad-Host at CUNYVM.CUNY.EDU No-User%Bad-Host at CUNYVM.CUNY.EDU
Wed Oct 31 18:47:15 AEST 1990


Since this is the season to find monsters, the script below will, when
put in your crontab, comb out your local disk and report back to you
when it finds NEW monster user files, relative to an OLD monster file.

The problem with a simple find statement is that setting it to print
all files larger than X blocks contains too much information. You want
to exclude all sorts of file, namely, large systems files, Known large
user files, and files that were already reported as monsters.

The script uses the output from the versions command, munges folded lines,
and recalculates the real sizes of the files (the inst database is incorrect).
This gives you a stop list of known system monsters to exclude from reporting.

You edit the file ExcludeKnownMonsters.sh to put a list of names of user
files to exclude (I don't know why unix is not know to versions as a system
file, but you can put it here anyway). The script will put in the sizes for
you. If the size of a known monster change, it will be reported.

The script looks for a file OldMonsters in the Monster directory. That is
a list of known monsters previous reported. If you want to start with
all new monsters, erase OldMonsters and you will get a list excluding
SystemMonsters and KnownMonsters. Every suceeding night, you will get
a note only if NEW monster sprouts, and you will not be bothered
by OLD monsters. You can always look in the Monster directory for a history
of the monsters growing on your disk.

Should you have a large number of large file, increase the THRESHOLD value.
If you have too many files, fgrep will break as its wordlist will be exceeded.
Note also, the threshold is in disk blocks, not bytes.

The script will report on monsters that change size, not just that they exist.
So an active monster will re-appear as often as its size changes are noted
each night.

Version.mac is some included script that reports on how often and what version
of the script is run. I have put that code in, but you can omit it if
you don't care to log when the script is run.

Please embelish and improve this to solve your disk management problems.
Let your users know you are watching the largest files on your disks.

Let me know if this is useful, or if you make changes to solve your problems.

Dan.

---------------------------MonsterFind.sh-------------------------------------
#! /bin/sh
#
# This version only notifies you if you have NEW monsters, relative to
# the OLD_MONSTERS files.
# Excludes System Monsters as culled from the sgi versions command.

. Version.mac
THRESHOLD=1000
STOPDIR=/usr/local/StopList
DIRNAME=/usr/local/Monsters
OLD_MONSTERS=OldMonsters
SYSTEM_MONSTERS=${STOPDIR}/SystemMonsters
KNOWN_MONSTERS=${STOPDIR}/KnownMonsters
TMP_A=Monster.a
TMP_B=Monster.b
TMP_C=Monster.c

        if [ ! -d $DIRNAME ]
        then
        mkdir $DIRNAME
        fi

        if [ ! -d $STOPDIR ]
        then
        mkdir $STOPDIR
        fi

cd $DIRNAME

FILENAME=`date "+Monsters.%m.%d"`

        if [ -f ${FILENAME} ]
        then
        i=0
        _FILENAME_=${FILENAME}
                while [ -f ${_FILENAME_} ]
                do
                _FILENAME_=${FILENAME}.${i}
                i=`expr ${i} + 1`
                done
        FILENAME=${_FILENAME_}
        fi

#       if [ ! -f ${SYSTEM_MONSTERS} ]
#       then
        ExcludeSystemMonsters.sh ${THRESHOLD} ${SYSTEM_MONSTERS}
#       fi

#       if [ ! -f ${KNOWN_MONSTERS} ]
#       then
        ExcludeKnownMonsters.sh ${THRESHOLD} ${KNOWN_MONSTERS}
#       fi

        if [ ! -f ${OLD_MONSTERS} ]
        then
# this is a new series.
        NEW_RUN=""
        echo 0000 dummy > ${OLD_MONSTERS}
        else
        NEW_RUN="notify"
        fi

cat <<HEREDOC > ${TMP_A}
Subject: New Monsters Found on `hostname` at `date`
$VERSION
Monster threshold is ${THRESHOLD} bytes.
------------------------------------------------------------------------------
HEREDOC
find / -local -size +${THRESHOLD} \( \! -type l \) -print | \
xargs /bin/ls -ds |\
fgrep -v -f ${SYSTEM_MONSTERS} |\
fgrep -v -f ${KNOWN_MONSTERS} |\
fgrep -v -f ${OLD_MONSTERS} |\
sort -rn > ${TMP_B}

MONSTERCOUNT=`wc -l ${TMP_B} |tr -s ' ' | /usr/bin/cut -d' ' -f2`

        if [ $MONSTERCOUNT = 0 ]
        then
        echo "$0 : No new monsters found"
        rm -f ${TMP_A} ${TMP_B} ${TMP_C}
        . End.mac
        exit 0
        fi

cat <<HEREDOC > ${TMP_C}
------------------------------------------------------------------------------
$0 Completed
${MONSTERCOUNT} monsters found
HEREDOC

cat ${TMP_A} ${TMP_B} ${TMP_C} > ${FILENAME}
cat ${TMP_B} >> ${OLD_MONSTERS}
# prune the OLD_MONSTER list to it does not exceed the wordlist size limit for f
   grep
sort -nur ${OLD_MONSTERS} -o ${OLD_MONSTERS}
rm -f ${OLD_MONSTERS}.a

        for i in `cut -d' ' -f2 < ${OLD_MONSTERS}`
        do
                if [ -r $i ]
                then
                ls -ds $i >> ${OLD_MONSTERS}.a
                fi
        done

mv ${OLD_MONSTERS} ${OLD_MONSTERS}.bak
mv ${OLD_MONSTERS}.a ${OLD_MONSTERS}
sort -nur ${OLD_MONSTERS} -o ${OLD_MONSTERS}

rm -f ${TMP_A} ${TMP_B} ${TMP_C} ${OLD_MONSTERS}.bak

        if [ "${NEW_RUN}" = notify ]
        then
        cat ${FILENAME} | mail root
        fi

. End.mac
exit 0


------------------------------ExcludeSystemMonsters.sh------------------------
#! /bin/sh

. Version.mac
THRESHOLD=$1
OUTFILE=$2
JOIN_SPLIT_LINES='
Couldn't execute the program!
'

SELECT_MONSTERS='
 $1 > THRESHOLD {print $2}
'

versions -s long |\
nawk   "${JOIN_SPLIT_LINES}" ROOT="/" |\
nawk "${SELECT_MONSTERS}" THRESHOLD=${THRESHOLD} |\
xargs /bin/ls -s |\
tr -s ' ' |
sort -nr > $OUTFILE

exit 0

-------------------------------ExcludeKnownMonsters.sh------------------------
#! /bin/sh
. Version.mac

MONSTER_NAMES="/unix /usr/lib/SoftPC/MSDOS_BOOT /usr/local/bin/iconsmith"

echo ${MONSTER_NAMES} | \
xargs /bin/ls -s |\
tr -s ' ' |\
nawk '$1 > THRESHOLD' THRESHOLD=$1 > $2
exit 0

------------------Version.mac-------------------------------------------------

BIN="/bin"
UBIN="/usr/bin"
PROGNAME=`${BIN}/basename $0`

for i in `echo "${PATH}" | ${UBIN}/tr ':' ' '`
do
case $i
in
\.*)i=`pwd`;;
esac
if [ -x ${i}/${PROGNAME} ]
then
VERSION="`${BIN}/ls -ls ${i}/${PROGNAME} | ${UBIN}/tr -s ' ' | ${UBIN}/cut -d' '
    -f2,7-12| ${BIN}/sed s=//=/=g `"
VERSION="`echo $VERSION | ${UBIN}/cut -d' ' -f6` Version `echo $VERSION | ${UBIN
   }/cut -d' ' -f1-5`"
break;

fi
done

USAGE_DIR=${HOME}/D.USAGE
if [ ! -d ${USAGE_DIR} ]
then
${BIN}/mkdir ${USAGE_DIR}
fi

${BIN}/date "+${VERSION}%tBEGIN%t%y.%m.%d.%t%T" >> ${USAGE_DIR}/${PROGNAME}
echo ${VERSION}
unset BIN UBIN PROGNAME USAGE_DIR

+-----------------------------------------------------------------------------+
| karron at nyu.edu (mail alias that will always find me)                        |
|                                         Dan Karron                          |
| . . . . . . . . . . . . . .             New York University Medical Center  |
| 560 First Avenue           \ \    Pager <1> (212) 397 9330                  |
| New York, New York 10016    \**\        <2> 10896   <3> <your-number-here>  |
| (212) 340 5210               \**\__________________________________________ |
| Please Note : Soon to move to dan at karron.med.nyu.edu 128.122.135.3  (Nov 1 )|
+-----------------------------------------------------------------------------+



More information about the Comp.sys.sgi mailing list