On 02/17/2014 05:48 AM, Marc Perkel wrote:
Hi,
I just wanted to contribute these 2 scripts to the crond project. they
explain themselves. on allows you to run a script up to 2400 times a
minute. The other allows you to run a script every X minutes and X can
be > 60 and not divisible by 60.
Feel free to include these.
http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every...
#! /bin/sh
# Microsecond Cron
# Usage: cron-ms start
# Copyright 2014 by Marc Perkel
# docs at
http://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_every...
# Free to use with attribution
basedir=/etc/cron-ms
if [ $# -eq 0 ]
then
echo
echo "cron-ms by Marc Perkel"
echo
echo "This program is used to run all programs in a directory in
parallel every X times per minute."
echo "Think of this program as cron with microseconds resolution."
echo
echo "Usage: cron-ms start"
echo
echo "The scheduling is done by creating directories with the number
of"
echo "executions per minute as part of the directory name."
echo
echo "Examples:"
echo " /etc/cron-ms/7 # Executes everything in that directory
7 times a minute"
echo " /etc/cron-ms/30 # Executes everything in that directory
30 times a minute"
echo " /etc/cron-ms/600 # Executes everything in that directory
10 times a second"
echo " /etc/cron-ms/2400 # Executes everything in that directory
40 times a second"
echo
exit
fi
# If "start" is passed as a parameter then run all the loops in parallel
# The number of the directory is the number of executions per minute
# Since cron isn't accurate we need to start at top of next minute
if [ $1 = start ]
then
for dir in $basedir/* ; do
$0 ${dir##*/} 60000000 &
done
exit
fi
# Loops per minute and the next interval are passed on the command line
with each loop
loops=$1
next_interval=$2
# Sleeps until a specific part of a minute with microsecond resolution.
60000000 is full minute
usleep $(( $next_interval - 10#$(date +%S%N) / 1000 ))
# Run all the programs in the directory in parallel
for program in $basedir/$loops/* ; do
if [ -x $program ]
then
$program &> /dev/null &
fi
done
# Calculate next_interval
next_interval=$(($next_interval % 60000000 + (60000000 / $loops) ))
# If minute is not up - call self recursively
if [ $next_interval -lt $(( 60000000 / $loops * $loops)) ]
then
. $0 $loops $next_interval &
fi
# Otherwise we're done
##########################
#! /bin/sh
# Minute Cron
# Usage: cron-min start
# Copyright 2014 by Marc Perkel
# docs
athttp://wiki.junkemailfilter.com/index.php/How_to_run_a_Linux_script_eve...
# Free to use with attribution
# Run this script under Cron once a minute
basedir=/etc/cron-min
if [ $# -gt 0 ]
then
echo
echo "cron-min by Marc Perkel"
echo
echo "This program is used to run all programs in a directory in
parallel every X minutes."
echo
echo "Usage: cron-min"
echo
echo "The scheduling is done by creating directories with the number
of minutes as part of the"
echo "directory name. The minutes do not have to evenly divide into
60 or be less than 60."
echo
echo "Examples:"
echo " /etc/cron-min/1 # Executes everything in that directory
every 1 minute"
echo " /etc/cron-min/5 # Executes everything in that directory
every 5 minutes"
echo " /etc/cron-min/13 # Executes everything in that directory
every 13 minutes"
echo " /etc/cron-min/75 # Executes everything in that directory
every 75 minutes"
echo
exit
fi
for dir in $basedir/* ; do
minutes=${dir##*/}
if [ $(( ($(date +%s) / 60) % $minutes )) -eq 0 ]
then
for program in $basedir/$minutes/* ; do
if [ -x $program ]
then
$program &> /dev/null &
fi
done
fi
done
Hi Marc,
according to Fedora conventions it should go into doc. Interested users
can easily change it. If other members of cronie list agree, I can add
it into next release.
Marcela