How to run a Linux script every few seconds under cron
From Computer Tyme Support Wiki
(Difference between revisions)
Line 123: | Line 123: | ||
</pre> | </pre> | ||
- | You can then create the directories | + | You can then create the directories needed to put your programs in that you want to run. |
mkdir /etc/cron.2sec | mkdir /etc/cron.2sec |
Revision as of 14:06, 9 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 ellegant 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.
#! /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.
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