How to run a Linux script every few seconds under cron
From Computer Tyme Support Wiki
(Difference between revisions)
Line 1: | Line 1: | ||
- | Did you ever want to run a program every few seconds under a linux, unix, bsd or osx cron script? Here's an | + | Did you ever want to run a program every few seconds under a linux, unix, bsd or osx cron script? Here's an elegant script that does just that. You can get 2,3,4,5,6,10,12,15,20,30 second resolution. Just run it once a minute under crond and it just works. |
+ | |||
+ | Features: | ||
+ | * Run once per minute under cron | ||
+ | * Launches multiple programs in parallel | ||
+ | * Multiple time periods supported simultaneously | ||
+ | * Use of timeout kills programs that don't terminate within delay time | ||
+ | * It just works | ||
+ | * Simple and elegant | ||
<pre> | <pre> |
Revision as of 16:15, 11 January 2014
Did you ever want to run a program every few seconds under a linux, unix, bsd or osx cron script? Here's an elegant script that does just that. You can get 2,3,4,5,6,10,12,15,20,30 second resolution. Just run it once a minute under crond and it just works.
Features:
- Run once per minute under cron
- Launches multiple programs in parallel
- Multiple time periods supported simultaneously
- Use of timeout kills programs that don't terminate within delay time
- It just works
- Simple and elegant
#! /bin/sh # Run all programs in a directory in parallel # Usage: run-parallel directory delay # Copyright 2013 by Marc Perkel # docs at http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every_few_seconds_under_cron" # Free to use with attribution if [ $# -eq 0 ] then echo echo "run-parallel by Marc Perkel" echo echo "This program is used to run all programs in a directory in parallel" echo "or to rerun them every X seconds for one minute." echo "Think of this program as cron with seconds resolution." echo echo "Usage: run-parallel [directory] [delay]" echo echo "Examples:" echo " run-parallel /etc/cron.20sec 20" echo " run-parallel 20" echo " # Runs all executable files in /etc/cron.20sec every 20 seconds or 3 times a minute." echo echo "If delay parameter is missing it runs everything once and exits." echo "If only delay is passed then the directory /etc/cron.[delay]sec is assumed." echo echo 'if "cronsec" is passed then it runs all of these delays 2 3 4 5 6 10 12 15 20 30' echo "resulting in 30 20 15 12 10 6 5 4 3 2 executions per minute." echo exit fi # If "cronsec" is passed as a parameter then run all the delays in parallel if [ $1 = cronsec ] then $0 2 & $0 3 & $0 4 & $0 5 & $0 6 & $0 10 & $0 12 & $0 15 & $0 20 & $0 30 & exit fi # Set the directory to first prameter and delay to second parameter dir=$1 delay=$2 # If only parameter is 2,3,4,5,6,10,12,15,20,30 then automatically calculate # the standard directory name /etc/cron.[delay]sec if [[ "$1" =~ ^(2|3|4|5|6|10|12|15|20|30)$ ]] then dir="/etc/cron.$1sec" delay=$1 fi # Exit if directory doesn't exist or has no files if [ ! "$(ls -A $dir/)" ] then exit fi # Sleep if both $delay and $counter are set if [ ! -z $delay ] && [ ! -z $counter ] then sleep $delay fi # Set counter to 0 if not set if [ -z $counter ] then counter=0 fi # Run all the programs in the directory in parallel # Use of timeout ensures that the processes are killed if they run too long for program in $dir/* ; do if [ -x $program ] then if [ "0$delay" -gt 1 ] then timeout $delay $program &> /dev/null & else $program &> /dev/null & fi fi done # If delay not set then we're done if [ -z $delay ] then exit fi # Add delay to counter counter=$(( $counter + $delay )) # If minute is not up - call self recursively if [ $counter -lt 60 ] then . $0 $dir $delay & fi # Otherwise we're done
You can then create the directories needed to put your programs in that you want to run. You don't have to create the directories that you aren't going to use.
mkdir /etc/cron.2sec mkdir /etc/cron.3sec mkdir /etc/cron.4sec mkdir /etc/cron.5sec mkdir /etc/cron.6sec mkdir /etc/cron.10sec mkdir /etc/cron.12sec mkdir /etc/cron.15sec mkdir /etc/cron.20sec mkdir /etc/cron.30sec
To run every minute you can edit your /etc/crontab file and add:
* * * * * root /usr/local/sbin/run-parallel cronsec