ports/Tools/portbuild/scripts/cleanup-chroots
Kris Kennaway 9e2b178527 Instead of using umount -f to unmount things, first use fstat to look for
processes holding open references within the FS and kill them, then use
regular umount.  This is necessary now that devfs cannot be force-unmounted,
and has the benefit that processes can't hang around holding references to
files between port builds.
2005-02-12 03:38:37 +00:00

82 lines
2 KiB
Bash
Executable file

#!/bin/sh
#
# To be run on the client, this script looks for chroot directories that have not been
# used in 20 minutes, as well as directories listed as 'in use' that have not been touched
# in 24 hours (corresponding to port builds that have timed out or shut down uncleanly)
# and prunes them to reclaim space.
kill_procs()
{
dir=$1
pids="XXX"
while [ ! -z "${pids}" ]; do
pids=$(fstat -f "$dir" | tail +2 | awk '{print $3}' | sort -u)
if [ ! -z "${pids}" ]; then
echo "Killing off pids in ${dir}"
ps -p $pids
kill -KILL ${pids} 2> /dev/null
sleep 2
fi
done
}
cleanup_mount() {
chroot=$1
mount=$2
if [ -d ${chroot}${mount} ]; then
mdir=$(fstat -f ${chroot}${mount} | head -2 | tail -1 | awk '{print $5}')
if [ "${mdir}" = "MOUNT" ]; then
umount ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} failed!"
fi
if [ "${mdir}" = "${chroot}${mount}" ]; then
kill_procs ${chroot}${mount}
umount ${chroot}${mount} || echo "Cleanup of ${chroot}${mount} failed!"
fi
fi
}
pb=/var/portbuild
arch=$(cat /etc/arch)
. ${pb}/${arch}/portbuild.conf
old=$(find ${scratchdir}/*/chroot/* -prune -mmin +20 2> /dev/null)
if [ -z "${old}" ]; then
exit 0
fi
# Prune out chroots with active builds
for i in ${old}; do
if [ ! -d ${i}/used ]; then
old2="${i} ${old2}"
# Also remove "in use" chroots that were set up more than 48 hours ago
elif [ ! -z "`find $i/used -prune -mmin +2880`" ]; then
echo "cleanup-chroots: Found old files on `hostname`:"
ls -l ${i}/tmp ${i}/used
echo "${i} allegedly in use but >48 hours old"
old2="${i} ${old2}"
fi
done
if [ -z "${old2}" ]; then
exit 0
fi
# cleanup old NFS and devfs mounts
for i in ${old2}; do
mounts=$(mount | grep $i | awk '{print $3}')
if [ ! -z "${mounts}" ]; then
for j in ${mounts}; do
umount ${j} || cleanup_mount ${j}
done
fi
done
mkdir -p ${scratchdir}/old
mv ${old2} ${scratchdir}/old
rm -rf ${scratchdir}/old 2> /dev/null
chflags -R noschg ${scratchdir}/old
rm -rf ${scratchdir}/old