具有的CRON以及mday和wday之间的关系

具有的CRON以及mday和wday之间的关系,cron,Cron,我看到的问题表明CRON计划的wday和mday字段之间的关系是OR关系。比如说,我想为每周五13号安排一些事情 而不是预期的结果,CRON 0 0 13 * 5 将给我每个月的所有周五,以及每个月的每13天 有没有办法避免这种行为并指定and关系?(似乎有人提到使用AND关系的旧版本,但是我更喜欢使用一个同时具备这两种功能的工具)我想,与其指定wday(Friday=5),不如指定13号是星期五的月份;因此,2019年: 0 0 13 9,12 * : do stuff, but avoid

我看到的问题表明CRON计划的
wday
mday
字段之间的关系是OR关系。比如说,我想为每周五13号安排一些事情

而不是预期的结果,CRON

0 0 13 * 5
将给我每个月的所有周五,以及每个月的每13天


有没有办法避免这种行为并指定and关系?(似乎有人提到使用AND关系的旧版本,但是我更喜欢使用一个同时具备这两种功能的工具)

我想,与其指定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

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

不幸的是,CRON没有按照您想要的方式工作

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

因此,您可以在每个月的第13天执行cron,但不要让命令在其
Friday

013*?*mybatchjob.sh
mybatchjob.sh

如果[`date+'%A'`=“Friday”];然后
回声“是的,星期五”;
其他的
回声“不是星期五”;
fi

这将确保计划的程序只在星期五和13日运行,您感兴趣的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)。如果是,它将执行
命令


扩展解释: 如果您希望具有特殊条件,通常需要通过测试自己实现这些条件。下面是总体结构:

# 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
成功,它将执行
命令
。下面的帖子中有一些使用类似技巧的示例:

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

[ $(date "+%u") = 5 ]
它使用
测试
命令(请参阅
人工测试
)。这是POSIX兼容的,可以与cron可能运行的任何shell(sh、bash、dash、ksh、zsh)一起使用。命令
date“+%u”
返回工作日从1到7(星期日是7)。有关更多信息,请参见
人员日期

所以你的工作看起来像:

  0  0 13  *  *    [ $(date "+\%u") = 5 ] && command
请注意,我们必须转义-字符

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

来源:
man5crontab


9,12
方法有风险。很有可能crontab在2020年3月(2019年后的下一个月,即13号星期五)之前无法正确更新。包装器脚本很好,是解决cron限制的常用方法。请注意,此命令的输出取决于系统的
locale
$LC_ALL=is_is.utf8 date'+%A'
返回星期五的
föstudagur