具有的CRON以及mday和wday之间的关系
我看到的问题表明CRON计划的具有的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
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
。