我偶然发现了这个例子:
0 9 1-7 * 1 * First Monday of each month, at 9a.m.
我不确定
1-7
应该是每个月的日期的部分。为什么是a1-7
而不是a*
?如何编写一个每 3 个月 0000 点运行的 cronjob?
0 0 1 */3 * *
以上是否正确?
答案1
#* * * * * command to be executed
#- - - - -
#| | | | |
#| | | | ----- Day of week (0 - 7) (Sunday=0 or 7)
#| | | ------- Month (1 - 12)
#| | --------- Day of month (1 - 31)
#| ----------- Hour (0 - 23)
#------------- Minute (0 - 59)
你的是正确的。五个星号之后,必须有一个 shell 命令。
您可以通过执行 来确认 cron 选项卡是否正在运行tail -f /var/log/syslog | grep CRON
。出于测试目的,您可以使用n
几分钟。
答案2
0 9 1-7 * *
每天(9:00)运行该作业一次,但仅在该月的前 7 天运行。这是在该月的第一个星期一运行作业的一种方法:在前 7 天运行它,但除非那天是星期一,否则不执行任何操作。
0 9 1-7 * * if [ "$(date +%u)" = 1 ]; then do_stuff; fi
0 9 * 1 *
每个星期一运行该作业。这是在该月的第一个星期一运行作业的另一种方式:每个星期一运行它,但除非是在该月的前 7 天内,否则不要执行任何操作。
0 9 * * 1 if [ "$(date +%_d)" -le 7 ]; then do_stuff; fi
0 9 1-7 * 1 *
看起来像是某种将这两种方法结合起来的失败尝试。请注意,0 9 1-7 * 1
每周一运行该作业和该月前 7 天的每一天。
至于0 0 1 */3 *
(你在最后多加了一个*
),它会在每个月的第一天午夜运行一个作业,但前提是该月是 3 的倍数。这确实是每三个月执行一次。
答案3
请注意,“第3个月“ 和 ”每 3 个月一次第一个是指从一年的第一个月开始每三个月。例如,以2021-11-01 00:00:00为起始点,我们有:
- 下一次 2021-04-01 00:00:00
- 然后在 2021-07-01 00:00:00
- 然后在 2021-10-01 00:00:00
- 然后在 2021-01-01 00:00:00
为了实现这一点,语法应该0 0 1 */3 * *
按照您的建议。看一下这个这里
另一个是指考虑当前的 3 个月。例如,如果我们以 2021-11-01 00:00:00 作为起始点,我们有:
- 下一次 2022-02-01 00:00:00
- 然后在 2022-05-01 00:00:00
- 然后在 2022-8-01 00:00:00
- 然后在 2022-11-01 00:00:00
要实现这一点,语法0 0 1 2-12/3 * *
如您所建议的那样。你可以看看这个这里。
请注意,您必须计算“的数量”每个月你想要” ,并从这个数字开始到一年中的最后一个(12月)。在前面的例子中,起始月份是11月(11月),如果我们计算未来3个月,我们将获得第 2 个月(明年 2 月)。