我已经看到一个this问题,该问题表明CRON计划的wday
和mday
字段之间的关系是“或”关系。举例来说,我想在13日的每个星期五安排一些时间。
CRON不是预期的结果
0 0 13 * 5
每个月的每个星期五以及每个月的13号都会给我。
有什么方法可以避免这种行为并指定AND关系? (似乎有人提到使用AND关系的旧版本,但是我宁愿使用能够同时实现两者的单个工具)
答案 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日运行