You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
josch fa1ae4670b README format improvements 12 years ago README format improvements 12 years ago
periodic first commit 12 years ago


Count or execute a program with an overall precise interval. Counting or execution does not "fall behind" over time. The overall frequency will stay the same and there will be no cumulative timing error.

This script is just a convenience wrapper around the sleepenh program.


POSIX shell and sleepenh


  • interval will stay the same on average and the counter will not "fall behind"
  • count upward or downward
  • specify interval length as a floating point number of seconds including fractions of one second
  • begin to count at given integer and count for a specific number of times or until infinity
  • print nothing at all
  • execute a program at every step, optionally by forking it from the script for programs possibly running longer than the given interval


Usage: periodic [ARGS] [COMMAND]

It counts upward (incrementing by 1, default) or downward (decrementing by 1, -d) starting at integer BEGIN (-b, default: 0) with a configurable floating point interval of SECS seconds (-n, default 1.0) until infinity (default) or up to a maximum number of COUNT intervals (-c). It can operate silently and not print this counter (-s). It optionally executes a COMMAND per interval which it can also fork (-f) in case the command is expected to take longer than SECS seconds.

-f       fork COMMAND
-s       silent, do not print counter
-d       count downward (default: upward)
-n SECS  interval of SECS in floating point (default: 1.0)
-c COUNT only run for COUNT interval(s) (default: -1 = infinity)
-b BEGIN start counting at BEGIN (default: 0)
-h       print this help message


I just wanted a program that reliably counted with a given frequency without suffering from cumulative timing errors. I did not want to accept the small delays that are adding up each time in a "while sleep(1)" loop. Being instructed to count up to a million with a frequency of 1 Hz, the total execution time should equal exactly one million seconds.

Apparently such a trivial program didnt exist, but there is the sleepenh program which is able to sleep for just the amount of time that the execution is done in with an overall precise interval. Therefor I built a script around that utility.

watch(1) comes very close to what I do but it can only run in fullscreen, doesnt go faster than 10Hz and doesnt allow the programs it executes to take longer than its interval.