这是我尝试过的
cron
表达式:0 0 0 */14 * ?
。它创建以下时间表:
开始时间:
2017 年 9 月 8 日星期五凌晨 1:25
下次:
- 2017 年 9 月 15 日星期五中午 12:00
- 2017 年 9 月 29 日星期五中午 12:00
- 2017 年 10 月 1 日,星期日,中午 12:00
- 2017 年 10 月 15 日,星期日,中午 12:00
- 2017 年 10 月 29 日,星期日,中午 12:00
这个表达式每个月每两周运行一次,但我的要求是它必须每两周运行一次。我的意思是在9月29日执行之后,下一个日期应该是10月13日,但它安排在10月1日。
每两周没有直接
cron
表达。我使用以下 cron
表达方式,类似于 2 周,但不完全是 2 周。
cron
每两周一次,每月 1 日和 15 日凌晨 1:30 表达:
30 1 1,15 * *
每两周星期五:
0 0 * * Fri [ $(expr $(date +%W) \% 2) -eq 1 ] && /path/to/command
30 7 1-7,14-21 * 1
“每月 1 日至 7 日、每月 14 日至 21 日以及周一的每天 07:30。”
我的 Ubuntu 18 上的 crontab 手册说:
注意:命令执行的日期可以通过两个字段指定 - 月份中的日期和星期几。如果两个字段都受到限制(i.e.,不是
),则当任一字段与当前时间匹配时将运行该命令。例如,*
会导致命令在每月 1 日和 15 日以及每个星期五的凌晨 4:30 运行。不过还是可以达到想要的结果 通过向命令添加测试(请参阅下面示例 CRON 文件中的最后一个示例)。30 4 1,15 * 5
提到的例子是:
# Run on every second Saturday of the month
0 4 8-14 * * test $(date +\%u) -eq 6 && echo "2nd Saturday"
您需要指定开始日期。否则,它将始终重置为该月的第一天。 所以这个表达式“0 0 0 23/14 OCT ? 2017”是从 2017 年 10 月 23 日开始每两周一次
我发现
0 */336 * * 1
是一个不错的技巧(每周一的第 14 天)。
(336 是 2 周内的小时数 - 即 24 x 14。)
我的14天周期是这样的
# ----------- rsync backup job --------------
# this will execute the crontab if the week is even
50 17 * * 5 [ $(( $(date +\%V) \% 2 )) -eq 0 ] && /home/user/.backup/rsync_even.sh >> /home/user/.backup/rsync.log 2>&1
# this will execute the crontab if the week is odd
50 17 * * 5 [ $(( $(date +\%V) \% 2 )) -eq 1 ] && /home/user/.backup/rsync_odd.sh >> /home/user/.backup/rsync.log 2>&1
0 3 */2 * 4
如果是星期四,则该活动将于每月第二天的 03:00 运行。理想情况下,每两周在星期四运行一次。
以星期四为例,一周是奇数(7天),每2天不会重复一个星期四,持续两周(14天)。如果您每两天跑步一次,持续 2 周,您将获得一天的出现次数。
0 0 1 2/14 * ?
从每月第 2 天开始,每 14 天凌晨 01:00
我指定了该月的开始日期,这有帮助