How to run a Linux script every few seconds under cron

From Computer Tyme Support Wiki

(Difference between revisions)
Jump to: navigation, search
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 ellegant script that does just that. You can get 2,3,4,5,6,10,12,15,20,30 second resolution.
+
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.
 +
 
<pre>
<pre>
  #! /bin/sh
  #! /bin/sh

Revision as of 04:10, 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 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
 
 if ! [ -d $dir ]
 then
    exit
 fi
 
 # Exit if directory has no files
 
 if ! [ "$(ls -A $dir/)" ]
 then
    exit
 fi
 
 # Sleep if both $delay and $counter are set
 
 if ! [ -z $delay ]
 then
    if ! [ -z $counter ]
    then
       sleep $delay
    fi
 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 [ $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:

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
Personal tools