This post has moved to eklausmeier.goip.de/blog/2014/02-09-scheduling-cron-jobs-on-business-days.
I found a marvelous way to run jobs on certain business days via cron
. The solution was depicted in Scheduling Cron Jobs on Business Days and it was written by a user named rdcwayx. The idea is to use the output of cal
and some Awk or Perl string-trickery.
The output of cal
looks like this
February 2014 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28
Here is the procedure, named chkbusday
, to decide whether current date is $1
-st business day of the month. The point is to extract the numbers below Mo-Fr, then split them, put each number into an array. The array index is $1
-st business day, disregarding holidays.
#!/usr/bin/perl -W use strict; my ($i,$s) = (0,""); my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time); exit 1 if ($#ARGV < 0); open(IN,"cal -h |") || exit 2; # turn off highligthing of today while (<IN>) { next if (++$i <= 2); $s .= substr($_,2,15); } my @F = split(/\s+/,$s); exit 3 if ($#F < $ARGV[0]); exit ($F[ $ARGV[0] ] != $mday);
So with chkbusday
it is now easy, for example, to check whether the current day is the fourth business day. Just prepend each command in cron
with
chkbusday 4 && command
A sample cron configuration is given below using above test for specific business day within a month.
# On 4th business day at 12:03 remind people 3 12 1-24 * * chkbusday 4 && some-command # # On 5th business day at 09:03 remind again 3 9 1-24 * * chkbusday 5 && another-command
It looks that using cal
and cutting out parts of its output is easier than redoing the calculation in ncal
. Source code of ncal
is here: ncal.c.
Watch out for the difference between cal
and ncal
. Ubuntu uses ncal
by default. On Red Hat one can use “cal -s
” for starting with Sunday — this option is not available in Ubuntu. On Ubuntu “cal -h
” suppresses highlighting. This option is not available on Red Hat’s version of cal
.