cron jobs can be set up to run at various times, such as:
Some cron systems can also be set to run jobs:
However, there are some things that standard cron configurations can't cope with, such as:
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…
There are two pretty much equally simple ways of going about this (and probably several others which are not so simple):
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…
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.
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
Some people might change `…` into $(…) - feel free to use this syntax if you prefer it.
Go up
Return to main index.