Scheduling Cron Jobs on Business Days

· klm's blog


Original post is here: eklausmeier.goip.de

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.

[more_WP_Tag] 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.

 1#!/usr/bin/perl -W
 2
 3use strict;
 4my ($i,$s) = (0,"");
 5my ($sec,$min,$hour,$mday,$mon,$year,$wday,$yday,$isdst) = localtime(time);
 6exit 1 if ($#ARGV < 0);
 7open(IN,"cal -h |") || exit 2;    # turn off highligthing of today
 8while (<IN>) {
 9        next if (++$i <= 2);
10        $s .= substr($_,2,15);
11}
12my @F = split(/\s+/,$s);
13exit 3 if ($#F < $ARGV[0]);
14exit ($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.