diff options
author | Aron Griffis <agriffis@gentoo.org> | 2004-05-25 03:55:27 +0000 |
---|---|---|
committer | Aron Griffis <agriffis@gentoo.org> | 2004-05-25 03:55:27 +0000 |
commit | c33d62a8a623a4dff3bfe0d01f3010a4b2a5ff5d (patch) | |
tree | aec3a099daf3f3f25ef4d2515db311afb77e5031 /sys-apps/cronbase/files | |
parent | Change doins to newins for Muttrc.mbox (diff) | |
download | historical-c33d62a8a623a4dff3bfe0d01f3010a4b2a5ff5d.tar.gz historical-c33d62a8a623a4dff3bfe0d01f3010a4b2a5ff5d.tar.bz2 historical-c33d62a8a623a4dff3bfe0d01f3010a4b2a5ff5d.zip |
Fix bug 45155 (run-crons and /var/spool/cron/lastrun/lock problems) by re-writing the locking code to be non-racy
Diffstat (limited to 'sys-apps/cronbase/files')
-rw-r--r-- | sys-apps/cronbase/files/digest-cronbase-0.3 (renamed from sys-apps/cronbase/files/digest-cronbase-0.2.1-r2) | 0 | ||||
-rw-r--r-- | sys-apps/cronbase/files/run-crons-0.2.1 (renamed from sys-apps/cronbase/files/run-crons) | 2 | ||||
-rw-r--r-- | sys-apps/cronbase/files/run-crons-0.3 | 96 |
3 files changed, 97 insertions, 1 deletions
diff --git a/sys-apps/cronbase/files/digest-cronbase-0.2.1-r2 b/sys-apps/cronbase/files/digest-cronbase-0.3 index e69de29bb2d1..e69de29bb2d1 100644 --- a/sys-apps/cronbase/files/digest-cronbase-0.2.1-r2 +++ b/sys-apps/cronbase/files/digest-cronbase-0.3 diff --git a/sys-apps/cronbase/files/run-crons b/sys-apps/cronbase/files/run-crons-0.2.1 index 84b1410436bb..af756a5942ef 100644 --- a/sys-apps/cronbase/files/run-crons +++ b/sys-apps/cronbase/files/run-crons-0.2.1 @@ -1,6 +1,6 @@ #!/bin/sh # -# $Header: /var/cvsroot/gentoo-x86/sys-apps/cronbase/files/run-crons,v 1.9 2003/11/19 06:31:23 prez Exp $ +# $Header: /var/cvsroot/gentoo-x86/sys-apps/cronbase/files/run-crons-0.2.1,v 1.1 2004/05/25 03:55:27 agriffis Exp $ # # 23 Jun 2002; Jon Nelson <jnelson@gentoo.org> run-crons: # diff --git a/sys-apps/cronbase/files/run-crons-0.3 b/sys-apps/cronbase/files/run-crons-0.3 new file mode 100644 index 000000000000..316c3398b17d --- /dev/null +++ b/sys-apps/cronbase/files/run-crons-0.3 @@ -0,0 +1,96 @@ +#!/bin/bash +# +# $Header: /var/cvsroot/gentoo-x86/sys-apps/cronbase/files/run-crons-0.3,v 1.1 2004/05/25 03:55:27 agriffis Exp $ +# +# +# 06 May 2004; Aron Griffis <agriffis@gentoo.org> run-crons: +# Make the locking actually work. The old code was racy. +# Thanks to Mathias Gumz in bug 45155 for some cleanups. +# +# 23 Jun 2002; Jon Nelson <jnelson@gentoo.org> run-crons: +# fixed a race condition, where cron jobs and run-crons wanted to +# delete touch files +# +# 20 Apr 2002; Thilo Bangert <bangert@gentoo.org> run-crons: +# moved lastrun directory to /var/spool/cron/lastrun +# +# Author: Achim Gottinger <achim@gentoo.org> +# +# Mostly copied from SuSE +# +# this script looks into /etc/cron.[hourly|daily|weekly|monthly] +# for scripts to be executed. The info about last run is stored in +# /var/spool/cron/lastrun + +LOCKDIR=/var/spool/cron/lastrun +LOCKFILE=${LOCKDIR}/lock + +mkdir -p ${LOCKDIR} + +# Make sure we're not running multiple instances at once. +# Try twice to lock, otherwise give up. +for ((i = 0; i -lt 2; i = i + 1)); do + ln -sn $$ ${LOCKFILE} 2>/dev/null + if [[ $? != 0 ]]; then + # lock failed, check for a running process. + # handle both old- and new-style locking. + cronpid=$(readlink ${LOCKFILE} 2>/dev/null || + cat ${LOCKFILE} 2>/dev/null) + if [[ $? == 0 ]]; then + if kill -0 ${cronpid} 2>/dev/null; then + # whoa, another process is really running + exit 0 + else + rm -f ${LOCKFILE} + fi + fi + fi +done + +# Set a trap to remove the lockfile when we're finished +trap "rm -f ${LOCKFILE}" 0 1 2 3 15 + + +for BASE in hourly daily weekly monthly +do + CRONDIR=/etc/cron.${BASE} + + test -d $CRONDIR || continue + + if [ -e ${LOCKDIR}/cron.$BASE ] + then + case $BASE in + hourly) + #>= 1 hour, 5 min -=> +65 min + TIME="-cmin +65" ;; + daily) + #>= 1 day, 5 min -=> +1445 min + TIME="-cmin +1445" ;; + weekly) + #>= 1 week, 5 min -=> +10085 min + TIME="-cmin +10085" ;; + monthly) + #>= 31 days, 5 min -=> +44645 min + TIME="-cmin +44645" ;; + esac + find ${LOCKDIR} -name cron.$BASE $TIME -exec rm {} \; + fi + + # if there is no touch file, make one then run the scripts + if [ ! -e ${LOCKDIR}/cron.$BASE ] + then + touch ${LOCKDIR}/cron.$BASE + + set +e + for SCRIPT in $CRONDIR/* + do + if [[ -x $SCRIPT && ! -d $SCRIPT ]]; then + $SCRIPT + fi + done + fi +done + +# Clean out bogus cron.$BASE files with future times +touch ${LOCKDIR} +find ${LOCKDIR} -newer ${LOCKDIR} -exec /bin/rm -f {} \; |