mirror of
https://git.freebsd.org/ports.git
synced 2025-06-24 14:10:30 -04:00
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.
82 lines
2 KiB
Bash
Executable file
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
|