geoff@desint.UUCP (Geoff Kuenning) (09/01/85)
Um, I hesitate to post this because the durned implementation is a hack,
but I think some of you folks might appreciate a little shell script I've
got. It's called 'ckuucp' and I run it every 20 minutes from crontab. It
checks 'df' to see if /usr or /usr1 (my news filesystem) is getting
full. (It's smart enough to add the sizes of D.* and TM.* files into the
news filespace, to allow for unbatching that hasn't happened). If things
start to look bad, it kills off any uucico that's running, and sends you mail.
Deficiencies: works for my system (SV.0), must be edited for others (somewhat
parameterized, though). Doesn't check # of inodes (shouldn't usually matter,
but once my free-inode count got mucked up and I lost news). Doesn't
distinguish non-news or outbound D.* files. When disk gets extremely low,
doesn't distinguish uucico's that are sending outbound D.* files
(which would actually free up space). Tends to leave lots of TM.* files
lying around (uuclean -n3 -pTM. can fix this nicely). No man page (shame on
me).
Anyway, it's small enough I figured I'd generate less traffic by posting
it than by polling to find out who wants it, so here it is. Best of luck.
Geoff Kuenning
...!ihnp4!trwrb!desint!geoff
------------------------------cut here--------------------------------
#!/bin/sh
#
# %W% %G% %U%
#
# Periodically check the amount of disk space left on /usr
# If it falls below $1 blocks (500 default), kill any running uucico
# as soon as its current temp file disappears. If it falls below
# $2 blocks (100 default), kill all running uucico's regardless of
# whether the current temp file is complete.
#
# The size of the news spool directory is also watched. If the sum of
# the sizes of the D.* and TM.* files in /usr/spool/uucp, subtracted
# from the free space on NEWSSYS, is less than $3 (default is the
# value of $1), a soft limit on uucico's is invoked. Similarly, if
# $4 (default $2) is exceeded, uucico's will be killed immediately.
#
# $5 is a multiplicative factor that will be applied to the number of
# blocks in D.* files. This is intended to allow space for fragmentation
# and archiving. The factor must be expressed as a rational number. It
# must be quoted, and if it contains shell metacharacters they must be
# escaped *inside* the quotes. For example,
#
# "5 \* 3"
#
PATH=/bin:/usr/bin
export PATH
SOFT=${1-500}
HARD=${2-100}
NSOFT=${3-$SOFT}
NHARD=${4-$HARD}
FACTOR=${5-"125 / 100"}
LIB=/usr/lib/uucp
SPOOL=/usr/spool/uucp
FILESYS=/usr
NEWSSYS=/usr1
cd $LIB
trap "rm -f $LIB/cklock*; exit 0" 1 2 3 9 15
# set up lock files to prevent simultaneous checking
cp /dev/null cklock
chmod 400 cklock
ln cklock cklock1 || exit 1
trap "rm -f $LIB/cklock*; exit 0" 0 1 2 3 9 15
# If there are less than $SOFT free blocks left on the $FILESYS
# file system, we must kill uucp. Restart is somebody else's business.
blocks=`df $FILESYS | sed "s/.*: *\([0-9][0-9]*\) blocks.*/\1/"`
nblocks=`df $NEWSSYS | sed "s/.*: *\([0-9][0-9]*\) blocks.*/\1/"`
totblocks=`ls -s /usr/spool/uucp/D.* /usr/spool/uucp/TM.* \
| awk 'BEGIN{tot=0}{tot += $1} END {print tot}'`
nblocks=`eval expr $nblocks - $totblocks "'*'" $FACTOR`
templist=`echo $SPOOL/TM.*`
if [ "$templist" = "$SPOOL/TM.*" ]
then
templist=
fi
while [ "X$templist" != X -a \
\( "$blocks" -le $SOFT -o 0"$nblocks" -le "$NSOFT" \) ]
do
if [ "$blocks" -le $HARD -o 0"$nblocks" -le "$NHARD" ]
then
plist=`ps -e|grep uucico|cut -c1-6`
case "X$plist" in
X)
;;
*)
kill $plist
echo uucico"'"s $plist killed due to no disk - \
"$blocks" "$nblocks" | mail root
;;
esac
exit 0
fi
sleep 120
nlist=
for i in $templist
do
if [ -f "$i" ]
then
nlist="$nlist $i"
elif [ "$i" != "$SPOOL/TM.*" ]
then
#
# Here we have found a disappearing temp file. We will kill
# the uucp that owned it before it gets too much farther.
#
sleep 30 # Give it time to die on its own
owner=`expr $i : $SPOOL'/TM\.0*\([1-9][0-9]*\)\....'`
kill $owner # Tough luck, it waited too long
echo uucico $owner killed due to low disk - "$blocks" "$nblocks" \
| mail root
fi
done
templist="$nlist"
blocks=`df $FILESYS | sed "s/.*: *\([0-9][0-9]*\) blocks.*/\1/"`
nblocks=`df $NEWSSYS | sed "s/.*: *\([0-9][0-9]*\) blocks.*/\1/"`
totblocks=`ls -s /usr/spool/uucp/D.* \
| awk 'BEGIN {tot = 0} {tot += $1} END {print tot}'`
nblocks=`eval expr $nblocks - $totblocks "'*'" $FACTOR`
done
exit 0
--
Geoff Kuenning
...!ihnp4!trwrb!desint!geoff