====== Unusual cron job settings ====== cron jobs can be set up to run at various times, such as: * X minutes past every hour * Y minutes past hour Z * X,Y and Z minutes past hours A,B and C * Every Monday at a particular time * The Nth day of each month at a particular time Some cron systems can also be set to run jobs: * 3 times per hour (at 0, 20 and 40 minutes past) * 4 times per hour plus an offset (eg: at 3, 18, 33 and 48 minutes past) However, there are some things that standard cron configurations can't cope with, such as: * the first Monday of each month * the last Friday of each month * the 14th of each month provided it's a Tuesday **Note:** It may at first seem simple to set up a job to run on the 14th of the month when it's a Tuesday, but it turns out that if you do specify this, the job runs **both** every Tuesday and also on the 14th of the month. It's the isolated instance of a logical OR between timings, when all others are a logical AND. 34 12 14 * Tue command.sh Anyway, back to the topic... ===== How do you set up a cron job to run on the first Monday of each month? ===== There are two pretty much equally simple ways of going about this (and probably several others which are not so simple): - Set up a job to run every Monday, and check whether it's the first one in the month - Set up a job to run on the first seven days of each month, and check whether the day is a Monday For example (assuming the job should run at 03:45 on the appropriate day) either of the following will work: 45 3 * * Mon test `date +%e` -lt 8 && command.sh 45 3 1-7 * * test `date +%u` -eq 1 && command.sh Note that I used "date +%u" to get the numerical day of the week (1=Monday, 7=Sunday) instead of "date +%a" (for Mon, Tue, Wed, etc) to avoid any internationalisation problems - you want the command to work on a machine whose system language is French or German just the same as it works in English. For the next example... ===== How do you set up a cron job to run on the last Friday of each month? ===== This not so simple, because there's no easy way of knowing which dates in a month represent the final seven days. In this case, we run a check every Friday to find out whether the current month is the same as the month in seven days' time: 45 3 * * Fri test `date +%m` -eq `date +%m -d +7days` || command.sh So, every Friday, if the month number equals the month number in 7 days' time, we do not run the command, otherwise we do. ===== How do you set up a cron job to run on every Tuesday when it's the 14th of the month? ===== By now this should be obvious - use either of: 45 3 * * Tue test `date +%e` -eq 14 && command.sh 45 3 14 * * test `date +%u` -eq 2 && command.sh ===== Backticks ===== Some people might change **`...`** into **$(...)** - feel free to use this syntax if you prefer it. ---- [[.:|Go up]]\\ Return to [[:|main index]].