
This is a classic problem. One of our FAQ is about cron job. I received lots of email with a question:
How do I run my script on 3rd Monday or 4th Friday only?
Cron does not offer this kind of facility i.e. you cannot run a script on the Nth weekday of the month.
However with one shell liner you can force to run a script on a given day:
Consider following date command, it will print day:
$ date +%a
Output:
Thu
You can compare output with weekday name using bash test [exrp ] syntax and the control operators && (AND list), you can write:
$ [ $(date '+%a') == 'Thu' ] && echo 'Today is Thu, run a command' || echo 'Noop'
First echo command get exectued only on Thursday. Now all you have to do is write a cron job to execute on first Monday:
# crontab -e
Now append code as follows:
# Run a script called myscript.sh on First Monday at 11:30:
30 11 1-7 * Mon [ "$(date '+%a')" == "Mon" ] && /path/to/myscript.sh
Hope this small tip will save your day. Please do share some of your favorite bash / shell scripting hacks in the comments. I will highlight some of the best in next shell scripting post.
See also:
- Executing script or command on the last day of a month
- Linux / UNIX cron job quick start guide
- Just like a seasoned admin, read bash and date man pages
You should follow me on twitter here or grab rss feed to keep track of new changes.
Featured Articles:
- 30 Handy Bash Shell Aliases For Linux / Unix / Mac OS X
- Top 30 Nmap Command Examples For Sys/Network Admins
- 25 PHP Security Best Practices For Sys Admins
- 20 Linux System Monitoring Tools Every SysAdmin Should Know
- 20 Linux Server Hardening Security Tips
- Linux: 20 Iptables Examples For New SysAdmins
- Top 20 OpenSSH Server Best Security Practices
- Top 20 Nginx WebServer Best Security Practices
- 20 Examples: Make Sure Unix / Linux Configuration Files Are Free From Syntax Errors
- 15 Greatest Open Source Terminal Applications Of 2012

- My 10 UNIX Command Line Mistakes
- Top 10 Open Source Web-Based Project Management Software
- Top 5 Email Client For Linux, Mac OS X, and Windows Users
- The Novice Guide To Buying A Linux Laptop











{ 12 comments… read them below or add one }
Nice trick, but the crontab is incorrect. As written it will run on all mondays. See crontab(5): “Note: The day of a command’s execution…”
# Run a script called myscript.sh on First Monday at 11:30:
30 11 1-7 * * [ "$(date '+%a')" == "Mon" ] && /path/to/myscript.sh
Hi, I wanted to run a script first Thursday of the every month. I added the script in crontab as per your suggesition. It seems somehow it didn’t work.
syntax:
32 13 1-7 * * ["$(date '+%a')" == "Thu"]&&/warehouse/db2scripts/db2_test.ksh > /tmp/db2_test.del
Can you please let me know if i did anything wrong.
Regards,
Ram.
Hi,
I need to execute a script file with the crontab.
I just enter the entry in cronfile and it is not working…
But I can exectute the script manually from the same location with out any issues…
Please advice on this
# Minute Hour Day of Month Month of Year Day of Week Command
57 * * * * sudo /var/opt/R_5.0.0/WebNMS/mysql/bin/mysqlbackup.sh
what i do to run my script automatically on last day of every month?
Just to share few lines regarding the problem I faced while setting up shell script thru cron …
Make sure you set at the very top of your script the directory path where you script lies, or else your script will crash using the relative path …
use …
cd `dirname $0`
This will take cron to your scripts directory and execute it form there ..hope it will save some1s time.
how to add php script to cron job
In answer to thegetpr’s question, try this to run a PHP script from cron
50 23 * * * lynx -dump http://www.example.com/scrip.php
Whoever put comment #4 it saved me a lot of time, I had a problem running the script in cron, but it did it!
Thanks a lot for your help.
I should have read the responses. Post 1 is right. I set this up and discovered the same thing.
Thanks for the tip anyway though it certainly helped me.
What is the syntax to run it every other Monday?
Hi ,
I don’t understanding why my perl script is not executing through crontab .
but it runs properly if we run it at command prompt by typing “perl $path_of_script”.
I found that cron daemon reads the line “perl $path_of_script” as command at proper timing defined in crontab and logs it in /var/log/cron.
But it is not executing.
I think it may be issue of environmental variables for cron daemon.
How to debug this issue ?
Thanks for help in advance.
Note that you must escape (\) the % in a crontab entry, otherwise cron will treat the % as a newline and feed the rest of the command line as STDIN. The correct command would be:
30 11 1-7 * * [ "$(date '+\%a')" == "Mon" ] && /path/to/myscript.sh
Thanks for the great tip