## 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
- due to supervision, no centralized daemon required
- filtering by ISO week and day of year
+Over systemd timers:
+- mnemonic syntax
+- less complexity for jobs, no need for a `<job>.timer` file distinct
+ from the `<job>.service` file,
+- can use a file timestamp to ensure minimum waiting time between two
+ runs, even across reboots
+- very robust with respect to external time changes
+- randomized delays
+- variable slack
+- ad-hoc usage possible, just run the program from command line
+
## Rosetta stone
* run five minutes after midnight, every day:
snooze: `-M5`
* run at 2:15pm on the first of every month:
cron: `15 14 1 * *`
- snooze: `-d1 -H2 -M15`
+ snooze: `-d1 -H14 -M15`
* run at 10 pm on weekdays:
cron: `0 22 * * 1-5`
snooze: `-w1-5 -H22`
* `-n`: dry-run, print the next 5 times the command would run.
* `-v`: verbose, print scheduled (and rescheduled) times.
* `-t`, `-T`: see below timefiles
-* `-R`: add between 0 and RANDDELAY seconds to the scheduled time.
+* `-R`: add between 0 and RANDDELAY seconds to the start of the scheduled time.
+* `-J`: add between 0 and JITTER seconds to scheduled execution 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,
+The durations RANDDELAY and JITTER 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:
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...
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/