Cron Command for twice a month on Sat @12am
I am wondering if someone can help with the simple but sometimes confusing commands regarding Cron jobs.
I would like a cron job to run twice a month on a Saturdat @12am.
What you want is unfortunately not possible. The schedule “twice a month on saturdays” cannot be expressed using crontab. You can say “twice a month” and you can say “on saturdays” but you cannot link these conditions using AND. They will always be linked using OR. As per man 5 crontab
:
Note: The day of a command's execution can be specified by two fields -- day of month, and day of week. If both fields are restricted (ie, are not *), the command will be run when either field matches the current time. For example, ``30 4 1,15 * 5'' would cause a command to be run at 4:30 am on the 1st and 15th of each month, plus every Friday.
However, you can use a shell expression to help!
I found this suggestion on a website:
0 0 * * Sun [ $(expr $(date +%W) % 2) -eq 1 ] && /path/to/command
Let‘s disect it!
-
0 0 * * Sun
is the cron schedule. It runs at midnight every sunday. -
[ $(expr $(date +%W) % 2) -eq 1 ] && /path/to/command
is the command (as far as cron is concerned)-
[ $(expr $(date +%W) % 2) -eq 1 ]
successfully returns if the week number of the year is odd-
expr $(date +%W) % 2
takes the output ofdate +%W
(“week number of year, with Monday as first day of week (00..53)”, other variations are also available) and applies a modulo operation (divide by two, return the remainder) -
[ $something -eq 1 ]
tests whether$something
equals 1 and returns the result as its exit code
-
-
&& /path/to/command
means to run the command if the previous command was successful (ie. if the week number is odd)
-
Using this expression, you can keep your scripts unmodified and the decision logic inside the crontab file.