有没有办法安排 CRON 的执行:
- 仅在一年中的第 25 至 36 周
- 仅限周一至周五(周末除外)
这是因为暑假期间人们会大量订购我们的产品。每周更改 CRON 设置非常繁琐。我理解 @weekly 不能与 star-settings 结合使用,因此类似下面的标记不是有效的标记:
* * 1,2,3,4,5 * * @weekly php /app/cmd import >> /logs/cron-offers.log
答案1
您应该可以按照以下方式进行操作:
# m h dom mon dow command
* * * * 1-5 /bin/bash -c "if [ `date +%W` -lt 15 ] && [ `date +%W` -gt 11 ]; then php /app/cmd import >> /logs/cron-offers.log; fi"
在第一个和第二个“[]”中输入正确的周数。
答案2
Cron 总体上是一个非常基本的调度程序,其语法不允许管理员轻松制定稍微不常见的调度程序。普通的 cron 没有可用的周数,因此您必须发挥创造力。
根据ncal -w 2018
第 25-36 周:
May June July August September
Mo 7 14 21 28 4 11 18 25 2 9 16 23 30 6 13 20 27 3
Tu 1 8 15 22 29 5 12 19 26 3 10 17 24 31 7 14 21 28 4
We 2 9 16 23 30 6 13 20 27 4 11 18 25 1 8 15 22 29 5
Th 3 10 17 24 31 7 14 21 28 5 12 19 26 2 9 16 23 30 6
Fr 4 11 18 25 1 8 15 22 29 6 13 20 27 3 10 17 24 31 7
Sa 5 12 19 26 2 9 16 23 30 7 14 21 28 4 11 18 25 1 8
Su 6 13 20 27 3 10 17 24 1 8 15 22 29 5 12 19 26 2 9
18 19 20 21 22 22 23 24 25 26 26 27 28 29 30 31 31 32 33 34 35 35 36
一种方法是创建多个批次,然后将它们组合起来创建您想要的时间表。例如,首先简单地选择 6 月最后两周的工作日,然后在第二个作业中选择 7 月和 8 月的所有工作日,在第三个作业中选择 9 月的第一天:
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
* * 18,19,20,21,22,25,26,26,28,29 jun * php /app/cmd import >> /logs/cron-offers.log
* * * jul,aug mon,tue,wed,thu,fri php /app/cmd import >> /logs/cron-offers.log
* * 3-7 9 * php /app/cmd import >> /logs/cron-offers.log
另一种选择是每天简单地运行批处理,并使用适当的编程/脚本语言的更强大的语法让批处理本身(即您的 PHP 代码)确定是否应立即执行或退出。