#!/bin/sh -e exec 2>&1 # This is a sample service configuration for maintaining a mirror of # multivac.cwru.edu. It is designed for use with D. J. Bernstein's # daemontools package from . # This script runs ./doit to update the local mirror every day at 2:30 AM # local time, normally. The script ./doit touches the file "started" when it # starts, to record the last time it was run, and touches the file "finished" # at the end, to record the last time it finished successfully. (If any # command before "touch finished" fails, the shell wil exit without running # any further commands, because of the -e flag.) If ./doit fails without # touching "finished", then the statfile...rw-min sequence below ensures that # ./doit will run again no more than 36 hours after the last time it ran # successfully. But even if ./doit fails repeatedly, the statfile...rw-max # sequence ensures that it will not run more often than once per hour, to # avoid overloading a clogged network link. # The commands in ./doit are put in a separate script so that we can edit # that script while rw-sleep is sleeping. The changes will take effect for # the next run without having to restart the service. # In line-by-line detail, this script: # runs as the user "mirroruser", # puts the current time plus 1 second into $now1s, # puts the earliest time after $now1s matching 2:30 AM into $wake # (adding 1 second ensures that if ./doit runs in less than one second, # rw-match won't schedule it to run again immediately; we'll schedule it for # 2:30 AM the next day), # puts the last-modified time of the file "finished" into $MTAI64N, # puts $MTAI64N plus 36 hours into $latest, # puts the earlier one of $wake and $latest into $wake, # puts the last-modified time of the file "started" into $MTAI64N, # puts $MTAI64N plus 1 hour into $earliest, # puts the later one of $wake and $earliest into $wake, # reports $wake in human-readable format, # sleeps until $wake, # and runs ./doit. # (The statfile command belongs to the misc/fdtools package.) exec \ setuidgid mirroruser \ rw-add n d1S now1s \ rw-match \$now1s ,H=2,M=30 wake \ statfile -M finished \ rw-add \$MTAI64N d36H latest \ rw-min \$wake \$latest wake \ statfile -M started \ rw-add \$MTAI64N d1H earliest \ rw-max \$wake \$earliest wake \ sh -c ' echo "@$wake" | tai64nlocal | sed "s/^/next run time: /" exec "$@"' arg0 \ rw-sleep \$wake \ ./doit