Crontab Day of the Week syntax
0
and 7
both stand for Sunday, you can use the one you want, so writing 0-6 or 1-7 has the same result.
Also, as suggested by @Henrik, it is possible to replace numbers by shortened name of days, such as MON
, THU
, etc:
0 - Sun Sunday
1 - Mon Monday
2 - Tue Tuesday
3 - Wed Wednesday
4 - Thu Thursday
5 - Fri Friday
6 - Sat Saturday
7 - Sun Sunday
Graphically, * * * * * command to be executed
stands for:
minute | hour | day of month | month | day of week | |
---|---|---|---|---|---|
(0-59) | (0-23) | (1-31) | (1-12) | (1-7) | |
* | * | * | * | * | command to be executed |
Does crontab day of week and day of month must both be matched at the same time?
It means if one of the two conditions is satisfied (can be both, does not need to be)
Note: The day of a command's execution can be specified in the following two fields — 'day of month', and 'day of week'. If both fields are restricted (i.e., do not contain the
*
character), 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.source:
man 5 crontab
In the examples of the OP, if the day is Wednesday Jan 09 2019
, than the crontab:
x x 9 x 2
will execute because it is the nineth day of the month, and
x x 10 x 3
will execute because it is a Wednesday
Cron Job to run on a range of days only on a particular day of week
This is the crontab format:
* * * * *
| | | | |
| | | | +---- Day of the Week (range: 0-6, 0 standing for Sunday)
| | | +------ Month of the Year (range: 1-12)
| | +-------- Day of the Month (range: 1-31)
| +---------- Hour (range: 0-23)
+------------ Minute (range: 0-59)
Ubuntu man 5 crontab
says:
field allowed values
----- --------------
minute 0-59
hour 0-23
day of month 1-31
month 1-12 (or names, see below)
day of week 0-7 (0 or 7 is Sun, or use names)
So, this should work for you:
0 0 2-31 * 0 /home/ubuntu/x.h
0 0 2-31 * 1-6 /home/ubuntu/y.h
I'm not sure why 7 would run on Saturday--is your system time accurate and in the right timezone?
Edit: Ah, yes, unfortunately you cannot specify both the day of the week and the day of the month. From 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 (i.e., aren't *), 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. One can, however, achieve the desired result by adding a test to the command (see the last example in EXAMPLE CRON FILE below).
So, the answer is:
0 0 2-31 * * test $(date +\%u) -eq 7 && /home/ubuntu/x.h
0 0 2-31 * * test $(date +\%u) -ne 7 && /home/ubuntu/y.h
$(date '+%u')
returns 1-7 representing Monday thru Sunday. Try echo $(date '+%u')
for an example.
crontab week of the day not working - it send everyday
This is the correct, documented behavior. From man 5 crontab
on Ubuntu 16.04 (emphasis mine):
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 (i.e., aren't *), 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. One can, however, achieve the desired result by adding a test to the
command (see the last example in EXAMPLE CRON FILE below).
Later in the man page they give an example that does just the sort of thing you want:
# Run on every second Saturday of the month
0 4 8-14 * * test $(date +\%u) -eq 6 && echo "2nd Saturday"
How to run crontab job every week on Sunday
Here is an explanation of the crontab format.
# 1. Entry: Minute when the process will be started [0-60]
# 2. Entry: Hour when the process will be started [0-23]
# 3. Entry: Day of the month when the process will be started [1-28/29/30/31]
# 4. Entry: Month of the year when the process will be started [1-12]
# 5. Entry: Weekday when the process will be started [0-6] [0 is Sunday]
#
# all x min = */x
So according to this your 5 8 * * 0
would run 8:05 every Sunday.
Crontab skip run once a week
Make it 2 lines:
0 0,8,16 * * 0-5
At minute 0 past hour 0, 8, and 16 on every day-of-week from Sunday through Friday.
And
0 8,16 * * 6
At minute 0 past hour 8 and 16 on Saturday.
You can change the day and hour which you want to skip, but there is no way to do this in 1 line as far as I know.
Crontab every monday syntax
I believe different cron implementations have different syntax.
For example, crontab.guru refers to cronitor as mentioned on the website:
crontab guru: The quick and simple editor for cron schedule expressions by Cronitor
Similarly, freeformatter refers to Quartz as mentioned on their website:
Generate a quartz cron expression with an easy to use online interface.
Which one should I use?
So I believe that depends on what cron you're using. For me, using crontab.guru worked fine for scheduling jobs on MacOS.
Related Topics
How to Find or Calculate a Linux Process's Page Table Size and Other Kernel Accounting
Search for a Cronjob with Crontab -L
How to Determine If Code Is Running in Signal-Handler Context
What's the Difference Between Tempfile and Mktemp
Allocate Writable Memory in the .Text Section
Colors with Unix Command "Watch"
How to Make R Read My Environmental Variables
Linux Debian Crontab Job Not Executed
Difference Between Flat Memory Model and Protected Memory Model
Vm/Min_Free_Kbytes - Why Keep Minimum Reserved Memory
Percentage Value with Gnu Diff
Differencebetween './Example.Sh' and 'Sh Example.Sh'
How to Find Out What Group a Given User Has
Error: Gdal-Config Not Found While Installing R Dependent Packages Whereas Gdal Is Installed