## snooze: run a command at a particular time
-`snooze` is a new tool for to wait until a particular time and then
-run a command. Together with a service supervision system such as runit,
-this can be used to replace cron(8).
+`snooze` is a new tool for waiting until a particular time and then
+running a command. Together with a service supervision system such as
+runit, this can be used to replace cron(8).
-`lr` has been tested on Linux 4.2.
+`snooze` has been tested on Linux 4.2.
It will likely work on other Unix-like systems with C99.
## Benefits
runs, even across reboots
- randomized delays (some cron have that)
- variable slack (no need for anacron)
+- ad-hoc usage possible, just run the program from command line
Over runwhen:
- less confusing usage (I hope)
Over uschedule:
- due to supervision, no centralized daemon required
+- filtering by ISO week and day of year
## Rosetta stone
* `-R`: add between 0 and RANDDELAY seconds to the scheduled time.
* `-s`: commands are executed even if they are SLACK (default: 60) seconds late.
+The durations RANDDELAY and SLACK and TIMEWAIT are parsed as seconds,
+unless a postfix of `m` for minutes, `h` for hours, or `d` for days is used.
+
The remaining arguments are patterns for the time fields:
* `-d`: day of month
When `-T` is *not* passed, snooze will start finding the first matching time
starting from the mtime of TIMEFILE, and taking SLACK into account.
-(E.g. `-H0 -s$((24*60*60)) -t timefile` will start an instant
+(E.g. `-H0 -s 1d -t timefile` will start an instant
execution when timefile has not been touched today, whereas without `-t`
this would always wait until next midnight.)
execs the command. You need to ensure (by setting up supervision)
snooze runs again after that!
* if we woke due to a SIGALRM, the command is executed immediately as well
+* if we notice time moved backwards, recompute the time until the event
* if the event is in the future, recompute the time it takes, possibly
considering shifting of the system time or timezone changes
- (possibly only works on glibc)
+ (timezone reload only tested on glibc)
* If no command was given, just return with status 0
* and so on...
Run a job daily, never twice a day:
- exec snooze -H0 -s $((24*60*60)) -t timefile \
+ exec snooze -H0 -s 1d -t timefile \
sh -c 'run-parts /etc/cron.daily; touch timefile'
Use snooze inline, run a mirror script every hour at 30 minutes past,
but ensure there are at least 20 minutes in between.
set -e
- snooze -H'*' -M30 -t timefile -T $((20*60))
- touch timefile # remove this if instantly retrying on failure is ok
+ snooze -H'*' -M30 -t timefile -T 20m
+ touch timefile # remove this if instantly retrying on failure were ok
mirrorallthethings
touch timefile
actualjob >output 2>&1 ||
mail -s "$(hostname): snooze job failed with status $?" root <output
+Snooze for rate-limiting a general purpose runit service: don't
+restart faster than every two minutes. (Note that after a crash with a
+daemon runtime of more than two minutes, it will be restarted
+immediately):
+
+ set -e
+ snooze -H'*' -M'*' -S'*' -t timefile -T 2m
+ touch timefile
+ exec mydaemond
+
## Installation
Use `make all` to build, `make install` to install relative to `PREFIX`
snooze is in the public domain.
-To the extent possible under law,
-Christian Neukirchen <chneukirchen@gmail.com>
-has waived all copyright and related or
-neighboring rights to this work.
+To the extent possible under law, Leah Neukirchen <leah@vuxu.org>
+has waived all copyright and related or neighboring rights to this work.
http://creativecommons.org/publicdomain/zero/1.0/