CRON与mday和wday之间的AND关系

时间:2019-06-18 16:15:25

标签: cron

我已经看到一个this问题,该问题表明CRON计划的wdaymday字段之间的关系是“或”关系。举例来说,我想在13日的每个星期五安排一些时间。

CRON不是预期的结果

0 0 13 * 5

每个月的每个星期五以及每个月的13号都会给我。

有什么方法可以避免这种行为并指定AND关系? (似乎有人提到使用AND关系的旧版本,但是我宁愿使用能够同时实现两者的单个工具)

3 个答案:

答案 0 :(得分:3)

我想,您不必指定wday(Friday = 5),而只需指定13日是星期五的月份;因此,对于2019年:

0 0 13 9,12 * : do stuff, but avoid black cats

或者,永远变得更加优雅,创建一个小脚本:

$> cat /home/me/bin/test_friday_13
#!/bin/bash
if [ "$(date +'%A %d')" != "Friday 13" ]
then
    exit 1
else
    : do stuff, but avoid black cats
    exit 0
fi

并输入crontab条目:

0 0 13 * * /home/me/bin/test_friday_13

脚本方法的另一个好处是可以从命令行运行它。 (注意:请不要忘记更改脚本中的工作日名称以反映您的环境。)

答案 1 :(得分:2)

您感兴趣的cron条目是:

# 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)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  0  0 13  *  *   [ $(date "+\%u") = "5" ] && command

这将在每月的13号执行cronjob。它将计算星期几,并测试它是否是星期五(5)。如果是这样,它将执行command


扩展说明: 如果要具有特殊条件,通常需要自己通过测试来实现这些条件。在下面,您可以看到常规结构:

# 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)
# |  |  |  |  |
# *  *  *  *  *   command to be executed
  0  0 13  *  *   /path/to/testcmd && command

如果测试成功,命令testcmd通常返回退出代码0,如果测试失败,则返回1。如果testcmd成功,它将执行command。以下帖子中提供了一些使用类似技巧的示例:

您要执行的测试在/bin/sh中写为:

[ $(date "+%u") = 5 ]

哪个使用test命令(请参见man test)。这是POSIX兼容的,并且可以与您的cron可以在其中运行的任何外壳一起使用(sh,bash,dash,ksh,zsh)。命令date "+%u"返回1至7的工作日(星期日为7)。有关更多信息,请参见man date

所以您的cronjob看起来像:

  0  0 13  *  *    [ $(date "+\%u") = 5 ] && command

请注意,我们必须转义字符。

  

该命令中的%字符,除非用反斜杠(\)进行转义,否则将被更改为换行符,并且第一个%之后的所有数据都将被发送到命令作为标准输入。

     

来源:man 5 crontab

答案 2 :(得分:1)

不幸的是,CRON无法按照您想要的方式工作

您可以在下面的网址上看到所有可用的选项

https://www.freeformatter.com/cron-expression-generator-quartz.html

因此,您可以做的是在每月的13号执行cron,但不要在命令Friday时运行命令

0 0 0 13 * ? * mybatchjob.sh

mybatchjob.sh

if [ `date +'%A'` = "Friday" ]; then 
   echo "Yep its Friday"; 
else 
   echo "Not Friday"; 
fi

这将确保目标程序仅在星期五和13日运行